我正在为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,程序集和相应连接字符串的一些信息:
SERVER={0};DATABASE={1};UID={2};PASSWORD={3}
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。
答案 0 :(得分:3)
退出块时using
构造调用Dispose
。它旨在清理非托管资源,无论如何。因此,如果您尝试再次访问该对象,则可以获得ObjectDisposedException
。处理此问题的一种简单方法是不尝试重复使用已处理的连接,而是每次都连接。或者,将处置逻辑移至更高级别,以便在处置之前完成所有数据库访问。