2017-12-18 20 views
0

SQLiteデータベースをC#WinFormで開き、例外を処理して奇妙なエラーを取得しようとしています。私はこのコードSQLite ADO.NetとエラーチェックでC#フォームを初期化する際にエラーが発生しました

bool TryingtoStart = true; 

while (TryingtoSTart) 
{ 
    try 
     { 
      dbc.Open(); 

       departmentDataAdapter = new SQLiteDataAdapter("select * from DEPARTMENT", dbc); 
       // etc 
     } 

     catch (SQLiteException ex) 
     { 
       DialogResult r = MetroFramework.MetroMessageBox.Show(this, ex.Message.ToString(), "Database error", MessageBoxButtons.RetryCancel); 

       if (r == DialogResult.Cancel) TryingtoStart = false; 
     } 

     catch (Exception exc) 
     { 
       DialogResult r = MetroFramework.MetroMessageBox.Show(this, exc.Message.ToString(), "Exception", MessageBoxButtons.RetryCancel); 
       if (r == DialogResult.Cancel) TryingtoStart = false; 
     } 

     if (!TryingtoStart) Application.Exit(); 
} 

そして実行すると、エラーに

"Operation is not valid due to the current state of the object." 

を取得を実施しています。それは2番目のcatch()から来ています。つまり、SQLExceptionではありません。私は私のcatchsを削除した場合、私は)エラーにオープンの行番号(と

System.InvalidOperationException: Operation is not valid due to the current state of the object. 
    at System.Data.SQLite.SQLiteConnection.Open() 

を取得

を呼び出して、私はwhileループのtry/catchを削除すると、すべてが正常に動作します。このコードはForm_Load()メソッドにあります。

私は試しましたが、これを理解できません。私はコメントをいくつかのコメントを外したとエラーが一貫しています。

+0

doh!ありがとうZohar。 if(dbc.State == ConnectionState.Open)のようなテストは中断します。仕事はOK?いくつかの状態があるように見えるので、特にOpenを安全に見えるように接続することができます。 –

+0

私の答えのコードをチェックしてください。 –

答えて

1

最初の試行ですべてがうまくいっていて、例外もなくなれば、ループから脱出することはありません。つまり、すでに開いている場合はdbc.Open();を再度実行しています。
これが例外の原因です。

データアダプタは、暗黙的に接続が開いていれば開くので、dbc.Open()コード行は必要ありません。 - 彼らは両方IDisposableインタフェースを実装しているため

bool TryingtoStart = true; 

while (TryingtoSTart) 
{ 

    using(var dbc = new SQLiteConnection(connectionString)) 
    { 
     try 
     { 
      using(var departmentDataAdapter = new SQLiteDataAdapter("select * from DEPARTMENT", dbc)) 
      { 
        // etc 
      } 

      // Note: This row will only be executed if there where no exceptions until this point in the code 
      TryingtoStart = false; 
     } 

     catch (SQLiteException ex) 
     { 

      if (MetroFramework.MetroMessageBox.Show(this, ex.Message.ToString(), "Database error", MessageBoxButtons.RetryCancel) == DialogResult.Cancel) Application.Exit(); 
     } 
     catch (Exception exc) 
     { 
      if (MetroFramework.MetroMessageBox.Show(this, exc.Message.ToString(), "Exception", MessageBoxButtons.RetryCancel) == DialogResult.Cancel) Application.Exit(); 
     } 
    } 
} 

注私はusing文の中SQLiteConnectionSQLiteDataAdapterの両方を作成しています:あなたのコードの

より良い実装は、このようなものになるだろう。

+0

ありがとう!これははるかに良いです。データアダプタが接続を開いていることを知ってうれしいです。 –

関連する問題