2009-06-17 146 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(); 
} 
相關問題