AnyDac - 如何断开与内存中的 sqlite db 的连接?

Posted

技术标签:

【中文标题】AnyDac - 如何断开与内存中的 sqlite db 的连接?【英文标题】:AnyDac - How to disconnect from in-memory sqlite db? 【发布时间】:2013-07-15 21:55:37 【问题描述】:

我在 Delphi XE2 上使用带有 AnyDac 的内存 SQLite 数据库。我注意到即使我在重新启动程序后忘记先连接数据库,我的查询也会返回结果,这可能是由 AnyDac 的自动连接功能引起的。问题是我猜这也一定意味着即使在程序本身终止后,内存数据库仍保留在内存中,这有点像内存泄漏。

我浏览了 AnyDac 文档并在线搜索,但我找不到任何方法来正确使用 AnyDac 与数据库断开连接。我注意到,当我调用 TADConnection 的“关闭”方法时,sqlite 文件似乎保持打开状态。我想我的内存数据库也会发生同样的情况。

谁能告诉我如何以正确和安全的方式完全关闭、断开和删除内存中的 SQLite 数据库?

【问题讨论】:

当然。 TADQuery 连接到 TADConnection。但是即使我完全终止了我的程序,当我再次启动它时,数据库仍然在内存中可用。 嗯,我评论了一条评论,询问我是否有 TADQuery。现在好像被删了。很奇怪。 【参考方案1】:

ADConnection.Close 完全删除内存中的 SQLite DB。使用下一个ADConnection.Open,显式或隐式地创建新的空内存数据库。

这可以通过简单的测试很容易地确认:

  ADConnection1.Open;
  ADConnection1.ExecSQL('create table TEST (A, B)');
  ADConnection1.ExecSQL('insert into TEST values (1, 2)');
  // show value of TEST.A
  ShowMessage(VarToStr(ADConnection1.ExecSQLScalar('select A from TEST')));
  ADConnection1.Close;
  ADConnection1.Open;
  // next statement generates exception - [FireDAC][Phys][SQLite] ERROR: no such table: TEST
  ShowMessage(VarToStr(ADConnection1.ExecSQLScalar('select A from TEST')));

【讨论】:

以上是关于AnyDac - 如何断开与内存中的 sqlite db 的连接?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi SQLite Wrapper 具有静态链接和加密支持

如何修复:Jooq 代码不会从 sql 脚本为内存 db 中的 sqlite 生成 java 代码

如何使用命令行工具 sqlite3 浏览内存中的 SQLite 数据库

TransactionScope 与 SQLite 内存数据库和 NHibernate

如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试

SQLite 如何变成 内存数据库