【发布时间】:2013-07-18 18:09:24
【问题描述】:
我正在使用本地 SQLite 数据库(使用 Delphi XE4 Professional)创建 Firemonkey 桌面应用程序,但数据库无法正常工作。没有问题,当我将一些数据插入数据库时,但是当我尝试在我的数据库上执行一些其他 SQL 命令(尤其是 DELETE 和 SELECT)时,我检索到消息“数据库已锁定”或类似“' 7 ' is not a valid integer value”。
在我的应用程序中,我使用了 TSQLConnection、TSQLQuery、TDataSetProvider 和 TClientDataSet 组件来连接到我的数据库。就像这个视频http://www.youtube.com/watch?v=ljdo0yUNVmA 一样,一切都连接到现有数据库,唯一的区别是,我的数据库不是 InterBase,而是 SQLite。
数据库是用 cmd 中的 SQLite3.7.11 创建的
CREATE TABLE History (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Kod TEXT( 7 ));
CREATE TABLE Drogs (
Kod TEXT( 7 ) PRIMARY KEY,
Naz TEXT( 60 ),
Dop TEXT( 60 ),
RegCis TEXT( 20 ),
ATC TEXT( 8 ),
Hraz TEXT( 1 ),
Obch TEXT( 1 ));
将数据库连接到我的应用程序后(如上所述),数据被插入到表Drogs
sKod := quotedstr('1234567');
sNaz := quotedstr('Name');
sHraz := quotedstr('0');
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('INSERT INTO Drogs (Kod, Naz, Hraz) ');
SQLQuery1.SQL.Add('VALUES('+sKod+','+sNaz+','+sHraz+')');
SQLQuery1.ExecSQL;
这没有问题,但是这段代码
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT * from Drogs');
SQLQuery1.Open;
给出类似的错误信息
'7 ' is not a valid integer value
和代码
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('DELETE FROM Drogs WHERE Hraz = "0"');
SQLQuery1.ExecSQL;
“有时”给出错误信息
Database is locked
任何想法,为什么会发生这种情况?我没有选择...
【问题讨论】:
-
我认为将 DBX 用于嵌入式数据库是多余的 - 也是因为 DBX 需要 Windows 的全局状态更改。如果你想嵌入 - 然后嵌入,使用原生 SQLite API - 有很多以 mORMot、ZeosDB 开头的包装器,甚至在 Google 和 Torry.net 中还有更多虽然我同意使用 interbase 没有意义 - 你始终可以将 Firebird Embedded 与 UIB 或 IBX+FBXUtils 等轻量级库一起使用。然后,您可以在 gmane.org 和/或 SQL.ru 上找到 FB 开发人员并用俄语与他们进行交流,而 SQLite 则不能
-
SQLQuery1.SQL.Add('VALUES('+sKod+','+sNaz+','+sHraz+')');- 错误代码。更好地使用参数并为这些参数指定正确的类型。 bobby-tables.com/delphi.html -
如我所见,您将 sKod 和 Hraz 作为字符串插入数据库中,尽管在这种情况下通常我们会使用整数。使用 select 打开 SQLQuery 时,您可能会尝试将所选数据加载到一些期望整数值的变量或控件中,此时您会收到错误“7”不是有效的整数值,因为它存储为字符串。检查您是否在 SqlQuery 或分配的数据源上有任何事件。这只是我的假设。如果您在插入或更新后尚未提交,则数据库可以在删除时锁定。
标签: sql database delphi local firemonkey