MySQL运行正常 - SQLite抛出ObjectDisposedException

时间:2015-08-04 10:25:40

标签: c# mysql sqlite compact-framework factory

我正在为Windows Mobile Handheld 6.5.3设备开发一个程序(注意:紧凑的框架!)。该应用程序是主要为MySQL构建的。由于我希望能够使用不同的数据库,我认为工厂计划是最好的方式。

所以我用一个教程(http://www.c-sharpcorner.com/UploadFile/db2972/factory-design-pattern/)创建了一个db工厂,并重写了大部分数据库部分,以便它使用正确的接口方法。

执行查询看起来像这样(简化):

using (conn)
  using (cmd)
  {
    conn.Open();
    // Prepare query and stuff
    //..
    // Fetch results
    conn.Close();
    // check result
    return result;
  }
}

根据第一个查询的结果,存在一系列数据库查询。在MySQL中使用我的应用程序没问题。但是切换到SQLite会在查询的ObjectDisposedException处引发conn.Open(),该查询将在第一个查询之后执行。

任何关于在c#中处理数据库的站点/教程都会在查询完成后立即关闭连接,并且 - 如果要执行新查询 - 只需再次打开连接。

为什么SQLite的代码有问题?除了ObjectDisposed之外,我如何从调试器获得任何提示(如:如何处理它以确保mysql运行良好)?

有关IDE,程序集和相应连接字符串的一些信息:

  • Visual Studio 2008教授
  • MySQL Connector / .NET - 6.9.6.0
    • SERVER={0};DATABASE={1};UID={2};PASSWORD={3}
  • System.Data.SQLite(https://system.data.sqlite.org) - 1.0.97.0 PocketPC / ARM
    • 试过Data Source=mydb.sqlite;Version=3;Pooling=True;Max Pool Size=100;FailIfMissing=True;
    • Data Source=mydb.sqlite;Version=3;FailIfMissing=True;
  • 数据库的相同结构和值

编辑:在调试时查看conn,显示在运行mysql conn.Close()时,似乎conn仍然可用(但显然已关闭)。在使用sqlite查看conn时,conn之后似乎conn.Close()被破坏了......由于IDbConnection接口,它不应该具有相同的行为吗?有什么暗示我现在可以做什么?

两位文档都说:public void Close()实现了IDbConnection.Close

编辑2 conn.Close()似乎不是问题 - 但using - 块的结尾是。我在conn-object上设置了一个debugger-watch,并用mysql和sqlite测试它。退出using-block后,conn-object被sqlite“破坏”,但没有使用mysql。

1 个答案:

答案 0 :(得分:3)

退出块时using构造调用Dispose。它旨在清理非托管资源,无论如何。因此,如果您尝试再次访问该对象,则可以获得ObjectDisposedException。处理此问题的一种简单方法是不尝试重复使用已处理的连接,而是每次都连接。或者,将处置逻辑移至更高级别,以便在处置之前完成所有数据库访问。