Firedac Sqlite查询在查询编辑器中运行,但从代码中调用时则不运行

时间:2019-07-18 14:37:30

标签: sqlite delphi firedac

在Delphi 10.3.1中使用Firedac的In SQlite内存数据库出现问题。我已经在表单中添加了适当的组件,将连接驱动程序ID设置为SQLite,并将数据库名称设置为:memory:(用于内存数据库)。 我已经创建了FDQuery1 SQL虚拟数据,如下所示:

DROP TABLE IF EXISTS dnsstats; (For debug purposes only)
create table DNSStats(Location nvarchar(30), IP_Address 
nvarchar(20),Ping_Time Integer,Index_No Integer);
insert into DNSStats values ('NoWhere', '123.234.111.112',100,1);
insert into DNSStats values ('AnyWhere', '123.234.111.113',10,2);
insert into DNSStats values ('SomeWhere', '123.234.111.114',120,3);
insert into DNSStats values ('WhatWhere', '123.234.111.115',106,4);
insert into DNSStats values ('ShareWhere', '123.234.111.116',101,5);
insert into DNSStats values ('UnderWhere', '123.234.111.117',200,6);
select * from DNSStats ORDER BY Location ASC;

在查询编辑器中执行此SQL时,它可以完美工作。我可以将ORDER BY更改为任何字段,SQL仍然可以正常运行。

但是,从以下代码运行时:

procedure TForm1.Button1Click(Sender: TObject);
begin
datasource1.DataSet:=fdtable1;
fdquery1.execute();
fdtable1.TableName:='DNSStats';
dbgrid1.DataSource:=datasource1;
fdtable1.Active:=true;
end;

该表中填充了适当的数据,但是ORDER BY Location ASC被忽略,并且为ORDER BY选择了任何其他字段时,情况就是这样。该应用程序未发布任何错误消息。

我无法弄清楚为什么它可以在查询编辑器中工作,但不能从代码中解决。我对SQlite和Firedac还是很陌生,因此将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用两个FDQueries代替FDTABLE

将FDQuery1的SQL文本设置为

DROP TABLE IF EXISTS dnsstats; (For debug purposes only)
create table DNSStats(Location nvarchar(30), IP_Address 
nvarchar(20),Ping_Time Integer,Index_No Integer);
insert into DNSStats values ('NoWhere', '123.234.111.112',100,1);
insert into DNSStats values ('AnyWhere', '123.234.111.113',10,2);
insert into DNSStats values ('SomeWhere', '123.234.111.114',120,3);
insert into DNSStats values ('WhatWhere', '123.234.111.115',106,4);
insert into DNSStats values ('ShareWhere', '123.234.111.116',101,5);
insert into DNSStats values ('UnderWhere', '123.234.111.117',200,6);

和FDQuery2的SQL文本

select * from DNSStats ORDER BY Location ASC;

然后

procedure TForm1.Button1Click(Sender: TObject);
begin
datasource1.DataSet:=fdquery2;
dbgrid1.DataSource:=datasource1;
fdquery1.execute();
fdquery2.Open();
end;