2009-06-17 192 views
1

我已经为.NET Compact Framework和本地SQL Server编写了自己的小型静态DAL类,它只是做我需要的; GetTable(SQL,params),Exec(SQL,params),ExecScalar(SQL,Params)等等。我想用SQL来做所有事情,这就是我如何滚动,如果有更好的方法来处理C#中的SQL连接 - 除ORM-请告诉我。以下是我给我的下DAL类到SQLConnection对象的公共访问:如何断开连接时重新连接到SQLServer?

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”。我如何区分连接问题和查询问题?

回答

1

我已经解决了每个查询使用新的SqlConnection,而不是共享一个静态SqlConnection的一切。

1

您可以使用System.Net.NetworkInformation.NetworkInterface类来检查网络是否可用?

您可以为您在.NET 2.0中使用GetIsNetworkAvailable()的网络连接:

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

要监控的IP地址或网络可用性的变化而变化使用事件从NetworkChange类:

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

按照前文的SO回答:C# - How do I check for a network connection

+0

不幸的是,.NET Compact Framework似乎不支持System.Net.NetworkInformation。 – 2009-06-17 15:06:25

1

你可以赶上SQLEXCEPTION并检查ErrorCode亲以查看它是否与连接丢失有关的错误(即,错误消息会像“无法连接到服务器”,并具有特定的错误代码)。

+0

如果我没有弄错,就不可能在Compact Framework上得到任何信息/数据库错误的内部except/errorcode。 – 2009-06-18 16:53:52

+0

看来你对错误代码在.NET CF中不支持,但你应该能够使用InnerException,Errors和Number属性来获得所需的信息。 – 2009-06-18 18:17:54

1

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

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

这对您的应用程序的数据量是否会起作用是另一回事。

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(); 
} 
相关问题