2009-06-17 19 views
1

.NET Compact FrameworkとローカルSQL Server用に、私が必要としているだけの小さな静的DALクラスを作成しました。 (SQL、params)、ExecScalar(SQL、Params)など。SQLですべてをやりたかったので、C#でSQL Connectionを処理するより良い方法があれば、私にお知らせください。ここで私は私の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クラスを使用してネットワークが利用できるかどうか確認できますか?

あなたはGetIsNetworkAvailableを使用して、.NET 2.0でのネットワーク接続()を確認することができます。

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

NetworkChangeクラスからイベントを使用するネットワークの可用性におけるIPアドレスの変更や変更を監視するには:

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をサポートしていないようです。 –

1
あなたは、SQLExceptionをキャッチし、 ErrorCodeプロをチェックすることができ

それが接続の喪失に関連するエラーであるかどうか(すなわち、エラーメッセージは "サーバーに接続できません"のようなもので、特定のエラーコードがあります)。

+0

私が間違っていないと、Compact Frameworkでデータベースエラーの内部/外部エラー/エラーコードを取得することはできません。 –

+0

.NET CFでサポートされていないErrorCodeについて正しいと思われますが、InnerException、Errors、およびNumberプロパティを使用して必要な情報を取得できるはずです。 –

+0

モバイルデバイスが接続されているときにデバッグを実行しても、エラーに関する情報を取得できません。 –

1

モバイルアプリケーションを扱っている場合は、ネットワークアクセスに頼ることはできません。

より良いアプローチは、ローカルデータベース(SQL CE、Sqlite)にアクセスし、メインデータベースとの変更(.Net Synchronization Servicesが役立ちます)を同期することです。

これは、アプリケーションのデータ量で機能するかどうかは別の話です。

+0

この方法の問題は、すべてのモバイルデバイスとネットワーク上のSQL Serverが常に同期されていることです。ただし、モバイルデバイスが無線LANの範囲外になる場合は例外です。 –

+0

私はあなたが間違っていると言っているつもりはありませんが、あなたは常に同期しなければならない場合は、あなたが実際にどこにあったかを見てきた最初のケ​​ースになります。 –

+0

違反はありません。デスクトップPCとPDAがSQL Serverを介して同期して動作するPOSアプリケーションです。たとえば、PDAが要求を送信すると、デスクトップクライアントは数分後に同様に更新することができます。 –

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(); 
} 
関連する問題