使用 SQLite ADO.Net 和错误检查初始化 C# 表单时出错

罗伯特·墨菲

我正在使用 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 循环try/catch,则一切正常。此代码位于 Form_Load() 方法中。

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

佐哈尔·佩莱德

如果第一次尝试一切顺利,没有例外,你就不会跳出循环。这意味着您正在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();
        }
    }
}

注意我在语句中同时创建了 theSQLiteConnectionSQLiteDataAdapterinside using- 因为它们都实现了IDisposable接口。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用ADO.NET(Xamarin,C#)从简单的SQLite数据库查询给定值的最新条目

C#ADO.NET参数化查询

在 ASP.NET C# Web 應用程序中使用 ADO.NET 和 XML

C#ADO.NET使用多个语句和注释加载SQL脚本

使用参数实例化表单时出错

使用ADO.NET填充数据集时出现错误-超时已过期

使用 ADO 从 Excel 导入 Access 时出错

使用初始化列表时检查传递给构造函数的参数-C ++

使用AdoptOpenJDK和OpenJFX时发生以下错误。“初始化QuantumRenderer时出错:找不到合适的管道”

如何使用ado.net和sqlparameter填充对象

使用 JOIN 的 ADO.NET 实体模型和 LINQ

使用c++ ADO时连接sql server 2017失败但返回空错误信息

使用 Root/C++ 时出错:“TTree”的初始化没有匹配的构造函数

如何使用ADO.NET和存储过程将复杂的C#对象保存在数据库中?

错误,当我使用 Selenium C# 初始化 IE 浏览器时

为什么在使用指针(C ++)时出现未初始化的堆内存错误?

使用隐藏的字段变量时C#字段初始化错误

执行SQL语句时ADO.NET错误

ASP.NET Core测试-在Fixture中初始化InMemory SQLite dbcontext时获取NullReferenceException

链接sqlite C时出错

使用C ++调用Fortran的SDL:范围和初始化错误

使用C#和SQLite创建注册表单

C ++在使用初始化列表之前如何检查条件?

使用C#和.NET 4.5连接到SSL服务器时出错

尝试使i = i * i时,为什么出现错误“使用未初始化的内存'i'”和“使用了未初始化的局部变量'i'”的错误

使用PHP,mySQL和XAMPP提交表单时出错

ADO.Net报告SQLite中的空数据类型

ADO.net服务器模式和ASP.net中的C#代码

错误C3074:数组只能使用初始化列表初始化