MySQL 运行正常 - SQLite 抛出 ObjectDisposedException
MySQL runs fine - SQLite throws ObjectDisposedException
我正在为 Windows Mobile Handheld 6.5.3 设备开发程序(注意:紧凑的框架!)。该应用程序主要为 MySQL 构建。因为我希望能够使用不同的数据库,所以我认为工厂方案是最好的方法。
所以我根据教程 (http://www.c-sharpcorner.com/UploadFile/db2972/factory-design-pattern/) 制作了一个数据库工厂并重写了大部分数据库部分,以便它使用正确的接口方法。
执行查询如下所示(简化):
using (conn)
using (cmd)
{
conn.Open();
// Prepare query and stuff
//..
// Fetch results
conn.Close();
// check result
return result;
}
}
根据第一个查询的结果,有一个数据库查询链。将我的应用程序与 MySQL 一起使用是没有问题的。但是切换到 SQLite 会在第一个查询之后执行的查询的 conn.Open()
处抛出一个 ObjectDisposedException
。
任何关于在 c# 中处理数据库的文章 site/tutorial 都指查询完成后立即关闭连接,如果您想执行新查询,只需再次打开连接。
为什么 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;
- 数据库的相同结构和值
Edit: 在调试时查看 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 获取 "destroyed",但使用 mysql.
获取不到
当您退出块时,using
构造调用 Dispose
。它旨在无论如何清理非托管资源。因此,如果您尝试再次访问该对象,您将获得 ObjectDisposedException
是有道理的。处理此问题的一种简单方法是不要尝试重用已处理的连接,而是每次都连接。或者,将您的处理逻辑移动到更高级别,以便在处理之前完成所有数据库访问。
我正在为 Windows Mobile Handheld 6.5.3 设备开发程序(注意:紧凑的框架!)。该应用程序主要为 MySQL 构建。因为我希望能够使用不同的数据库,所以我认为工厂方案是最好的方法。
所以我根据教程 (http://www.c-sharpcorner.com/UploadFile/db2972/factory-design-pattern/) 制作了一个数据库工厂并重写了大部分数据库部分,以便它使用正确的接口方法。
执行查询如下所示(简化):
using (conn)
using (cmd)
{
conn.Open();
// Prepare query and stuff
//..
// Fetch results
conn.Close();
// check result
return result;
}
}
根据第一个查询的结果,有一个数据库查询链。将我的应用程序与 MySQL 一起使用是没有问题的。但是切换到 SQLite 会在第一个查询之后执行的查询的 conn.Open()
处抛出一个 ObjectDisposedException
。
任何关于在 c# 中处理数据库的文章 site/tutorial 都指查询完成后立即关闭连接,如果您想执行新查询,只需再次打开连接。
为什么 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;
- 尝试过
- 数据库的相同结构和值
Edit: 在调试时查看 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 获取 "destroyed",但使用 mysql.
当您退出块时,using
构造调用 Dispose
。它旨在无论如何清理非托管资源。因此,如果您尝试再次访问该对象,您将获得 ObjectDisposedException
是有道理的。处理此问题的一种简单方法是不要尝试重用已处理的连接,而是每次都连接。或者,将您的处理逻辑移动到更高级别,以便在处理之前完成所有数据库访问。