【转】在向服务器发送请求时发生传输级错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。
今天在做数据库备份程序的时候出现了这样的异常。
代码为
///杀死原来所有的数据库连接进程
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=.;Initial Catalog=master;User ID=sa;pwd =123456";
conn.Open();
string sql = "SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='" +
"jc"+ "'";
SqlCommand cmd1 = new SqlCommand(sql, conn);
SqlDataReader dr;
ArrayList list = new ArrayList();
try
{
dr = cmd1.ExecuteReader();
while (dr.Read())
{
list.Add(dr.GetInt16(0));
}
dr.Close();
}
catch (SqlException eee)
{
MessageBox.Show(eee.ToString());
}
finally
{
conn.Close();
}
//MessageBox.Show(list.Count.ToString());
for (int i = 0; i < list.Count; i++)
{
conn.Open();
cmd1 = new SqlCommand(string.Format("KILL {0}", list[i].ToString()), conn);
cmd1.ExecuteNonQuery();
conn.Close();
MessageBox.Show("系统已经清除的数据库线程: " + list[i].ToString() + "\r\n正在还原数据库!");
}
//这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程
//占用了数据库。
string constr = @"Data Source=.;Initial Catalog=master;User ID=sa;pwd =123456";
string database = "jc";
string path = backfile;
string BACKUP = String.Format("RESTORE DATABASE {0} FROM DISK = '{1}' with replace", database, path);
SqlConnection con = new SqlConnection(constr);
SqlCommand cmd = new SqlCommand(BACKUP, con);
con.Open();
try
{
cmd.ExecuteNonQuery();
MessageBox.Show("还原成功!");
}
catch (SqlException ee)
{
MessageBox.Show(ee.ToString());
}
finally
{
con.Close();
}
在最后加 SqlConnection.ClearAllPools(); 解决了问题
////////////////////////////////////////////////已下是自己遇到的问题mhy
还原备份的SQL数据库后,在第一次执行数据导入操作时发生错误:
if (server == "localhost" && user == "null" && pwd == "null")
source = "data source=(local);integrated security=SSPI;initial catalog="+dbname+";Max Pool Size = 1024";
if (server != "localhost" && user == "null" && pwd == "null")
source = "data source=" + server + ";integrated security=SSPI;initial catalog=" + dbname + ";Max Pool Size = 1024";
if (server == "localhost" && user != "null" && pwd != "null")
source = "data source=(local);user id=" + user + ";password =" + pwd + ";initial catalog=" + dbname + ";Max Pool Size = 1024";
if (server != "localhost" && user != "null" && pwd != "null")
source = "data source=" + server + ";user id=" + user + ";password =" + pwd + ";initial catalog=" + dbname + ";Max Pool Size = 1024";
conn = new SqlConnection(source);——》执行到此异常“在向服务器发送请求时发生传输级错误。( provider 共享内存提供程序 error 0 管道的另一端上无任何进程)”
网上搜索一下,解决建议“在向服务器发送请求时发生传输级错误。(provider:共享内存提供程序,error:0-系统无法打开文件。) 最好不要使用需要备份或还原的数据库连接,而使用master”。
“估计是还原时,Connection被中断,代码没有检查Connection是否可用,就Fill了,结果就出错。”
所以
source字符串改为:source = "data source=(local);integrated security=SSPI;initial catalog=master;Max Pool Size = 1024";(目前没有试此方法可行不,因为没有出现该错误)
另外有说法如下:
在向服务器发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 1 - 执行读/写操作期间检测到 I/O 错误。)
查看具体的异常信息有这样的提示 “System.Data.Sqlclent.SqlException: {"已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。)"}”
其实原因很简单,你的数据库的服务被停用了 只要重新启动服务即可 “Net start Mssqlserver” 这样就Ok了。