断开连接后如何重新连接到SQLServer?

时间:2009-06-17 14:47:21

标签: c# sql-server compact-framework

我为.NET Compact Framework和本地SQL Server编写了我自己的小型静态DAL类,它可以满足我的需求; GetTable(SQL,params),Exec(SQL,params),ExecScalar(SQL,Params)等。我想通过SQL做所有事情,这就是我如何滚动,如果有更好的方法来处理C#中的SQL连接 - 除了ORM-请告诉我。以下是我在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;
    }

我编码的应用程序正在移动Windows CE 5.0上使用。问题是,当用户从无线网络断开连接然后重新连接时,if (conn.State != ConnectionState.Open)行不会被执行,应用程序会提供一般数据库异常,没有别的。我该如何解决这个问题?

编辑:由GetTable()等函数引发异常。我可以在每个函数中使用try-catch来处理它,但不幸的是在Compact Framework中,每个sql错误都被命名为“SqlException”。如何区分连接问题和查询问题?

5 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

更好的方法是让所有人都访问本地数据库(SQL CE,Sqlite),然后将更改(.Net同步服务将帮助解决)与主数据库同步。

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

答案 3 :(得分:1)

我已经通过为每个查询使用新的SqlConnection而不是为所有内容共享一个静态SqlConnection来修复它。

答案 4 :(得分:0)

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();
}