半城烟沙

导航

【转】在向服务器发送请求时发生传输级错误。 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了。

 

posted on 2010-05-19 14:30  半城烟沙  阅读(9865)  评论(0编辑  收藏  举报