我正在为 Windows Mobile Handheld 6.5.3 设备开发一个程序(注意:紧凑的框架!)。该应用程序主要是为 MySQL 构建的。因为我希望能够使用不同的数据库,所以我认为工厂方案是最好的方法。
所以我根据教程 (http://www.c-sharpcorner.com/UploadFile/db2972/factory-design-pattern/) 创建了一个数据库工厂,并重写了大部分数据库部分,以便它使用正确的接口(interface)方法。
执行查询看起来像这样(简化):
using (conn)
using (cmd)
{
conn.Open();
// Prepare query and stuff
//..
// Fetch results
conn.Close();
// check result
return result;
}
}
根据第一个查询的结果,有一个数据库查询链。将我的应用程序与 MySQL 一起使用没有问题。但是切换到 SQLite 会在第一个查询之后执行的查询的 conn.Open()
处抛出一个 ObjectDisposedException
。
任何编写有关在 c# 中处理数据库的网站/教程都提到在查询完成后立即关闭连接,如果您想执行新查询,只需再次打开连接即可。
为什么 SQLite 对我的代码有问题?除了 ObjectDisposed 之外,我如何从调试器获得任何提示(如:如何在确保 mysql 运行正常的情况下处理它)?
关于 IDE、程序集和相应的连接字符串的一些信息:
- Visual Studio 2008 教授
- MySQL 连接器/.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 接口(interface)的行为?有什么提示我现在可以做什么吗?
两个文档都说:public void Close()
实现了 IDbConnection.Close
编辑 2:conn.Close()
似乎不是问题所在 - 但 using
block 的结尾是.我在 conn-object 上设置了一个 debugger-watch,并用 mysql 和 sqlite 对其进行了测试。退出 using block 后,conn 对象会被 sqlite“销毁”,但不会被 mysql 销毁。
最佳答案
当您退出 block 时,using
构造调用 Dispose
。它旨在无论如何清理非托管资源。因此,如果您尝试再次访问该对象,您将收到 ObjectDisposedException
是有道理的。处理此问题的一种简单方法是不要尝试重用已处理的连接,而是每次都连接。或者,将您的处理逻辑移动到更高级别,以便在处理之前完成所有数据库访问。
关于c# - MySQL 运行良好 - SQLite 抛出 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31806788/