【问题标题】:FMX Desktop application with local SQL database. Database doesn't work properly带有本地 SQL 数据库的 FMX 桌面应用程序。数据库无法正常工作
【发布时间】: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


【解决方案1】:

转到 SQLQuery1 并设置“Active = False”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多