在还原数据库时,我是这样写的,先连接master数据库
因为要对指定的数据库做还原,所以要先清除该数据库的所有连接,然后再还原,还原后再次访问该数据库就会出现下面的错误:
System.Data.SqlClient.SqlException: 在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)
解决办法是:
在成功还原数据库后,调用SqlConnection.ClearAllPools();即可。
源码如下:
string fileName = this.fileUploadRestore.FileName;//获取要还原的文件
string pathname = DateTime.Now.ToString("yyyyMMddHHmmss");
string path = Server.MapPath("../databak/" + pathname + ".bak");//获取绝对路径
SqlConnection reScon = new SqlConnection("server=.;database=master;uid=sa;pwd=");//新建连接
try
{
//复制文件到服务器
this.fileUploadRestore.PostedFile.SaveAs(path);//保存文件到指定文件夹
string reSql1 = "restore database AssetsManage from disk ='" + path + "' with replace"; //还原语句
string reSql2 = "select spid from master..sysprocesses where dbid=db_id('AssetsManage')"; //强制关闭原来连接的语句
reScon.Open();//打开连接
SqlCommand reScm1 = new SqlCommand(reSql2, reScon);//执行查询找出与要还原数据库有关的所有连接
SqlDataAdapter reSDA = new SqlDataAdapter(reScm1);
DataSet reDS = new DataSet();
reSDA.Fill(reDS); //临时存储查询结果
for (int i = 0; i < reDS.Tables[0].Rows.Count; i++)//逐一关闭这些连接
{
string killSql = " kill " + reDS.Tables[0].Rows[i][0].ToString();
SqlCommand killScm = new SqlCommand(killSql, reScon);
killScm.ExecuteNonQuery();
}
SqlCommand reScm2 = new SqlCommand(reSql1, reScon);//执行还原
reScm2.ExecuteNonQuery();
MessageBox.Show(this, "数据库还原成功!");
SqlConnection.ClearAllPools();//还原成功后,加上这句话,再次访问数据库,就不会报:在向服务器发送请求时发生传输级错误。
}
catch
{
MessageBox.Show(this, "还原数据库失败,请确保清除数据库所有连接,再进行数据库还原!");
}
finally
{
File.Delete(path);//删除文件
reScon.Close();//关闭本次连接
reScon.Dispose();//释放资源
}