代码之家  ›  专栏  ›  技术社区  ›  curious slab

断开连接时如何重新连接到sqlserver?

  •  1
  • curious slab  · 技术社区  · 17 年前

    我已经为.NET Compact Framework和本地SQL Server编写了自己的小型静态DAL类,它们可以满足我的需要;gettable(sql,params)、exec(sql,params)、execscalar(sql,params)等。我想通过sql来完成所有工作,所以这就是我的工作方式,如果有更好的方法来处理C中的SQL连接,请告诉我。下面是我如何在DAL类下授予对sqlconnection对象的公共访问权:

        public static SqlConnection Conn()
        {
            if (ConnStr == "")
                Defaults();
            try
            {
    
                if (conn == null)
                    conn = new SqlConnection(ConnStr);
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                    Execute("SET DATEFORMAT DMY",null);
                }
                return conn;
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Unable to connect to DB");
            }
            return null;
        }
    

    我正在编码的应用程序正在移动WindowsCE5.0上使用。问题是,当用户从无线网络断开连接,然后重新连接, if (conn.State != ConnectionState.Open) 行不会被执行,应用程序会给出一个一般的数据库异常,其他什么都没有。我该怎么解决这个问题?

    edit:结果发现gettable()等函数引发了异常。我可以在每个函数中使用try catch来处理它,但不幸的是,在紧凑的框架中,每个SQL错误都被命名为“sqlException”。如何区分连接问题和查询问题?

    5 回复  |  直到 10 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    你能用吗? System.Net.NetworkInformation.NetworkInterface 类来检查网络是否可用?

    可以使用getIsNetworkAvailable()在.NET 2.0中检查网络连接:

    System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
    

    要监视IP地址的更改或网络可用性的更改,请使用networkchange类中的事件:

    System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
    System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
    

    如前所述,回答: C# - How do I check for a network connection

        2
  •  1
  •   Tom van Enckevort    17 年前

    您可以捕获sqlException并检查 ErrorCode 属性来查看是否是与连接丢失相关的错误(即,错误消息类似于“无法连接到服务器”,并且具有特定的错误代码)。

        3
  •  1
  •   Chris Brandsma    17 年前

    如果您处理的是移动应用程序,您将永远无法依赖网络访问。

    更好的方法是让所有人访问本地数据库(SQL CE、SQLite),然后将更改与主数据库同步(.NET同步服务将对此有所帮助)。

    这是否适用于应用程序的数据量是另一回事。

        4
  •  1
  •   curious slab    17 年前

    我通过为每个查询使用新的sqlconnection来修复它,而不是为所有查询共享一个静态sqlconnection。

        5
  •  0
  •   user3335966 David Jenkins    10 年前
    using (SqlConnection connectionNEWDB = new SqlConnection(
            myConnectionStringNEWDB))
    {
        while (connectionNEWDB.State != ConnectionState.Open)
        {
            try
            {
                connectionNEWDB.Open();
            }
            catch (SqlException ex)
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
    
        string droptablefirst = "DROP TABLE " + t1 + ";";
    
        SqlCommand command33 = new SqlCommand(droptablefirst, connectionNEWDB);
    
        try
        {
            command33.ExecuteNonQuery();
        }
        catch (SqlException ex)
        {
            //   Console.WriteLine("Create Class ex.Message = " + ex.Message + " connection string:" + myConnectionStringNEWDB);
            //  treeView1.Invoke(new Add44(Add4), new object[] { (indexstart / 4) + 1, " error at constr: " + myConnectionStringNEWDB + " Message:" + ex.Message + " Source:" + ex.Source });
        //    MessageBox.Show(" error at constr: " + myConnectionStringNEWDB + " Message:" + ex.Message + " Source:" + ex.Source + " query: " + t1q);
    
        }
        command33.Dispose();
    }