C# 断开连接时如何重新连接到SQLServer?

C# 断开连接时如何重新连接到SQLServer?,c#,sql-server,compact-framework,C#,Sql Server,Compact Framework,我为.NET Compact Framework和本地SQL Server编写了自己的小型静态DAL类,它们正是我所需要的;GetTableSQL、params、ExecSQL、params、ExecScalarSQL、params等。我想用SQL做所有事情,所以我就是这样做的,如果有更好的方法来处理C中的SQL连接-除了ORM-请告诉我。以下是我如何在DAL类下授予对SQLConnection对象的公共访问权: public static SqlConnection Conn()

我为.NET Compact Framework和本地SQL Server编写了自己的小型静态DAL类,它们正是我所需要的;GetTableSQL、params、ExecSQL、params、ExecScalarSQL、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上使用。问题是,当用户从无线网络断开连接时,如果连接状态为!=OpenLine不会被执行,应用程序只会给出一个一般的数据库异常,而不会给出其他异常。我该如何解决这个问题

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

能否使用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
根据前面的SO回答:

能否使用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

根据前面的SO回答:

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

您可以捕获SqlException并检查属性,以查看是否是错误与连接丢失相关的错误消息,如无法连接到服务器,并且有特定的错误代码。

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

更好的方法是让所有人都访问本地数据库SQLCE、Sqlite,然后同步更改。Net同步服务将有助于将更改与主数据库同步


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

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

更好的方法是让所有人都访问本地数据库SQLCE、Sqlite,然后同步更改。Net同步服务将有助于将更改与主数据库同步


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

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

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

不幸的是,.NET Compact Framework似乎不支持System.NET.NetworkInformation。不幸的是,.NET Compact Framework似乎不支持System.NET.NetworkInformation。如果我没有弄错的话,就不可能在Compact Framework上获取数据库错误的任何信息/Internal exceptoin/errorcode。关于.NET CF中不支持的错误代码,您似乎是对的,但您应该能够使用InnerException,获取所需信息的错误和数字属性。即使在连接移动设备时进行调试,我仍然无法获取有关错误的任何信息。如果我没有弄错,则无法在Compact Framework上获取数据库错误的任何信息/内部exceptoin/errorcode。错误代码未被删除似乎是正确的支持.NET CF,但您应该能够使用InnerException,错误和数字属性以获取所需信息。即使在连接移动设备时进行调试,我仍然无法获取任何有关错误的信息。此方法的问题是所有移动设备和网络上的SQL Server必须始终同步,除非移动设备超出wifi范围——这只是无意中发生的。我不是想说你错了,但如果你必须一直同步,你的设备将是我见过的第一个真实情况,我经常听到。没有冒犯。这是一个POS应用程序,桌面计算机和PDA通过SQL Server同步工作,例如,一旦PDA发布请求,桌面客户端可能会在几分钟后更新它,同样。这种方法的问题是所有移动设备和网络上的SQL Server必须始终同步,除非移动设备超出wifi范围-仅限
y是无意中发生的。我不是想说你错了,但是如果你必须一直同步,你的情况将是我见过的第一个真实情况,我经常听到。没有冒犯。它是一个POS应用程序,桌面计算机和PDA通过SQL Server同步工作,例如,一旦PDA发出请求,桌面客户端可能会在几分钟后更新它,同样。