- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 ASP.NET 应用程序(框架 4.0)中使用 System.Data.SQLite 提供程序。我遇到的问题是,当我在 SQLite 数据库的表中插入某些内容时,数据库被锁定并且即使在处理连接后也不会释放锁定。
尝试访问文件时,错误是:“进程无法访问文件 'catalog.sqlite',因为它正被另一个进程使用。”
我的代码非常简单,我打开连接,从 SQLServer 数据库中读取一些数据,将该数据插入 SQLite(通过 SQLiteDataAdapter),然后关闭连接并处理所有内容以确保安全。但是,当我在用数据填充文件后尝试压缩文件时,仍然会遇到该错误。
我在 StackOverflow 上阅读了各种建议,但没有一个有助于解决问题(关闭防病毒软件、更改事务模型、等待几秒钟然后压缩文件、将所有插入调用包装到交易等。但都没有帮助解决这个问题。
也许有一些特定于 ASP.NET 的东西(多线程是问题?即使我在一台开发机器上测试它,那里只有一个对该函数的调用并且没有并发?)
作为旁注,我尝试避免使用 DataTable 和 SQLiteDataAdapter 并直接仅使用 SQLiteCommand,这样就很有魅力了。当然,我可以继续将查询构建为字符串,而不是使用数据适配器,但是当构建了一个框架来执行此操作时,我觉得有点尴尬。
最佳答案
我在使用 System.Data.Sqlite.dll
版本 1.0.82.0 附带的设计器生成的数据集/表适配器时遇到了同样的问题——关闭连接后我们无法读取数据库使用 System.IO.FileStream
的文件。我正确地处理了连接和表适配器,并且没有使用连接池。
根据我的第一次搜索(例如 this 和 this thread ),库本身似乎存在问题——对象未正确释放和/或池问题(我不使用)。
阅读您的问题后,我尝试仅使用 SQLiteCommand 对象来复制问题,但我发现当您不处理它们时就会出现问题。 更新 2012-11-27 19:37 UTC:this ticket 进一步证实了这一点对于 System.Data.SQLite,开发人员在其中解释说“所有与连接关联的 SQLiteCommand 和 SQLiteDataReader 对象 [应该] 正确处理”。
然后我重新打开生成的 TableAdapter,我看到没有执行 Dispose
方法——所以实际上创建的命令没有被释放。我实现了它,负责处理所有命令,我没有遇到任何问题。
这是 C# 中的代码,希望对您有所帮助。请注意,代码是从 original in Visual Basic 转换而来的,因此预计会出现一些转换错误。
//In Table Adapter
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
Common.DisposeTableAdapter(disposing, _adapter, _commandCollection);
}
public static class Common
{
/// <summary>
/// Disposes a TableAdapter generated by SQLite Designer
/// </summary>
/// <param name="disposing"></param>
/// <param name="adapter"></param>
/// <param name="commandCollection"></param>
/// <remarks>You must dispose all the command,
/// otherwise the file remains locked and cannot be accessed
/// (for example, for reading or deletion)</remarks>
public static void DisposeTableAdapter(
bool disposing,
System.Data.SQLite.SQLiteDataAdapter adapter,
IEnumerable<System.Data.SQLite.SQLiteCommand> commandCollection)
{
if (disposing) {
DisposeSQLiteTableAdapter(adapter);
foreach (object currentCommand_loopVariable in commandCollection)
{
currentCommand = currentCommand_loopVariable;
currentCommand.Dispose();
}
}
}
public static void DisposeSQLiteTableAdapter(
System.Data.SQLite.SQLiteDataAdapter adapter)
{
if (adapter != null) {
DisposeSQLiteTableAdapterCommands(adapter);
adapter.Dispose();
}
}
public static void DisposeSQLiteTableAdapterCommands(
System.Data.SQLite.SQLiteDataAdapter adapter)
{
foreach (object currentCommand_loopVariable in {
adapter.UpdateCommand,
adapter.InsertCommand,
adapter.DeleteCommand,
adapter.SelectCommand})
{
currentCommand = currentCommand_loopVariable;
if (currentCommand != null) {
currentCommand.Dispose();
}
}
}
}
更新 2013-07-05 17:36 UTC gorogm's answer强调两件重要的事情:
根据 changelog在 System.Data.SQLite 的官方网站上,从版本 1.0.84.0 开始,应该不需要上面的代码,因为库会处理这个。我没有测试过这个,但在最坏的情况下你只需要这个片段:
//In Table Adapter
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
this.Adapter.Dispose();
}
关于 TableAdapter
的 Dispose
调用的实现:最好把它放在分部类中,这样数据集重新生成就不会影响此代码(以及您可能需要添加的任何其他代码)。
关于c# - SQLite 即使在连接关闭后仍保持数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532729/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!