代码之家  ›  专栏  ›  技术社区  ›  Robert Murphy

使用SQLite ADO初始化C#表单时出错。网络和错误检查

  •  1
  • Robert Murphy  · 技术社区  · 8 年前

    我正在用C#WinForm打开一个SQLite数据库,试图处理异常,但出现了一个奇怪的错误。我已经实现了这个代码

    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." 
    

    运行时。这来自第二个catch(),即它不是SQLException。如果我删除了捕获,我会得到错误

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

    使用open()调用的行号

    如果我删除while循环 试试看,一切都很好。此代码的格式为\u Load()方法。

    我试过了,但无法理解这一点。我已经注释/取消注释了几次,错误是一致的。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Zohar Peled    8 年前

    如果在第一次尝试中一切顺利,无一例外,你就不会跳出循环。这意味着您正在运行 dbc.Open(); 再次-一旦它已经打开。
    这就是导致异常的原因。

    顺便说一句,如果连接关闭,数据适配器会隐式打开连接,因此您甚至不需要 dbc.Open() 代码行。

    更好的代码实现如下:

    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();
            }
        }
    }
    

    注意,我正在创建 SQLiteConnection 以及 SQLiteDataAdapter 内部a using 语句-因为它们都实现 IDisposable 界面