等待海关清关是啥意思:SQL+.NET高手进来帮俺看看这代码~

来源:百度文库 编辑:神马品牌网 时间:2024/05/04 19:27:33
private void button1_Click(object sender, System.EventArgs e)
{
///
///备份方法
///
SqlConnection conn = new SqlConnection("Server=.;Database=master;User ID=sa;Password=;");
SqlCommand sqlcom = new SqlCommand();
sqlcom.CommandType = CommandType.Text;
sqlcom.Connection = conn;
sqlcom.CommandText = @"backup database Archives to disk='D:\ba' with init";
try
{
conn.Open();
sqlcom.ExecuteNonQuery();
MessageBox.Show("备份成功!!!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
conn.Dispose();
}
}
///
///还原方法
///
private void button2_Click(object sender, System.EventArgs e)
{
SqlConnection conn = new SqlConnection("Server=.;Database=master;User ID=sa;Password=;Trusted_Connection=False");
conn.Open();

//除去所有的数据库进程
SqlCommand cmd = new SqlCommand("SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='test'", conn);
SqlDataReader dr;
dr = cmd.ExecuteReader();
ArrayList list = new ArrayList();
while(dr.Read())
{
list.Add(dr.GetInt16(0));
}
dr.Close();
for(int i = 0; i < list.Count; i++)
{
cmd = new SqlCommand(string.Format("KILL {0}", list), conn);
cmd.ExecuteNonQuery();
}

SqlCommand cmdRT = new SqlCommand();
cmdRT.CommandType = CommandType.Text;
cmdRT.Connection = conn;
cmdRT.CommandText = @"restore database Archives from disk='D:\ba'";

try
{
cmdRT.ExecuteNonQuery();
MessageBox.Show("还原成功!!!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}

帮解释下~~越详细越好~~
代码已经连接了master数据库,可还原数据的时候还是出现“数据库正在使用,所以未获得对数据库的排它访问权“异常,还请高手解答。。。。

private void button1_Click(object sender, System.EventArgs e)
{
///
///备份方法
///
SqlConnection conn = new SqlConnection("Server=.;Database=master;User ID=sa;Password=;"); //定义Connection连接对象
SqlCommand sqlcom = new SqlCommand();
sqlcom.CommandType = CommandType.Text; //定义CommandType格式
sqlcom.Connection = conn; //Connection连接对象绑定
sqlcom.CommandText = @"backup database Archives to disk='D:\ba' with init"; //此句是备份数据库语句,格式:backup database 数据库名 to disk='路径'
try //try 语名,如果try里面执行错误,则执得后面的catch语句
{
conn.Open(); //打开连接
sqlcom.ExecuteNonQuery();//执行SQL命令,正确执行则继续执行下一句,错误则跳出,执行catch语句
MessageBox.Show("备份成功!!!"); //弹出对话框
}
catch(Exception ex)//抛出错误执行,Exception 为异常类,即只要发生错误,程序就会抛出个Exception给catch执行
{
MessageBox.Show(ex.Message); //弹出对话框
}
finally //如try里面出错则不执行这一句.try执行成功则执行
{
conn.Close(); //关闭连接
conn.Dispose(); //释放出内存空间
}
}
///
///还原方法
///
private void button2_Click(object sender, System.EventArgs e) //定义button2按扭
{
SqlConnection conn = new SqlConnection("Server=.;Database=master;User ID=sa;Password=;Trusted_Connection=False"); //同上
conn.Open(); //同上

//除去所有的数据库进程
SqlCommand cmd = new SqlCommand("SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='test'", conn); //定义command连接,查找两个表,条件是表sysprocesses的dbid列等于表sysdatabases的dbid列,并且表sysdatabases的name等于test,conn为连接对像
SqlDataReader dr; //定义一个SqlDataReader对象
dr = cmd.ExecuteReader();//SqlDataReader对象dr绑定打开
ArrayList list = new ArrayList();
while(dr.Read()) //如果dr读不为空
{
list.Add(dr.GetInt16(0)); //装dr的第一行转成int类型并连接到list后面
} //直到dr读空
dr.Close(); //关闭SqlDataReader dr对象
for(int i = 0; i < list.Count; i++) //这一行你知道吧?list.Count是list中的字符数
{
cmd = new SqlCommand(string.Format("KILL {0}", list), conn);
cmd.ExecuteNonQuery();
}

SqlCommand cmdRT = new SqlCommand(); //建立Command连接对象
cmdRT.CommandType = CommandType.Text;
cmdRT.Connection = conn;
cmdRT.CommandText = @"restore database Archives from disk='D:\ba'"; //还原数据库SQL语句,Archives是数据库名,d:\ba是路径

try//以下同上
{
cmdRT.ExecuteNonQuery(); //执得语句,成功弹出"还原成功!!!",失败弹出ex.Message错误对话框.
MessageBox.Show("还原成功!!!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message); //弹出出错对话框
}
finally//同上
{
conn.Close(); //关闭连接
}
}

原因很简单,因为你正在使用master,解决方法:conn的database连别的库(随便一个就行了,就是不能用你要备份的那个)

还原时不要连接那个需要还原的数据库