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