我在 Delphi 2010 上使用 SQLite3 和 Zeoslib。以下代码应该遍历表中的记录并更新字段。因此,它在while
循环检查 END OF FILE 条件中。但是,它永远不会中断,而是不断循环,永远使程序崩溃。我确实发现根据 SELECT 语句返回了一条记录。这是代码。打开查询以执行 SQL 语句。所以,我不知道为什么它会说它是一个封闭的数据集,除非post
操作之后立即关闭查询。
procedure TAlarmMgrDlg.Update(alarm:TAlarm);
begin
DataModule1.AlarmQuery.Close;
DataModule1.AlarmQuery.SQL.Clear;
DataModule1.AlarmQuery.SQL.Add('SELECT * FROM ALARMS');
DataModule1.AlarmQuery.SQL.Add('WHERE TAGNAME = ''' + string(alarm.Tagname) + '''');
DataModule1.AlarmQuery.SQL.Add('AND ALARM_NAME = ''' + string(alarm.Name) + '''');
DataModule1.AlarmQuery.SQL.Add('AND ALARM_STATE = 2');
DataModule1.AlarmQuery.Open;
if not DataModule1.AlarmQuery.Isempty then
DataModule1.AlarmQuery.First;
while not DataModule1.AlarmQuery.EOF do
begin
DataModule1.AlarmQuery.Edit;
DataModule1.AlarmQuery.FieldValues['ACKTIME'] := Now;
DataModule1.AlarmQuery.FieldValues['ALARM_STATE'] := 1;
if alarm.IsAutoAck then
DataModule1.AlarmQuery.FieldValues['USER_ACK'] := 'AUTO'
else
begin
if UserProfile = nil then
begin
if alarm.LogUserID = true then
begin
DataModule1.AlarmQuery.FieldValues['USER_ACK'] := ThisUserID;
end
else
begin
DataModule1.AlarmQuery.FieldValues['USER_ACK'] := 'No User';
end;
end
else
begin
if alarm.LogUserID = true then
begin
DataModule1.AlarmQuery.FieldValues['USER_ACK'] := ThisUserID;
end
else
begin
DataModule1.AlarmQuery.FieldValues['USER_ACK'] := UserProfile.fName;
end;
end;
end;
DataModule1.AlarmQuery.Post;
end;
end;
以下是使用 DataModule 创建数据库的方式:
ZConnection1.Protocol:='sqlite-3';
ZConnection1.Database:=basedir + 'alrmdata\alarms.db';
ZConnection1.Connect;
AlarmQuery.SQL.Add('CREATE TABLE IF NOT EXISTS alarms ');
AlarmQuery.SQL.Add('(TAGNAME VARCHAR(16),');
AlarmQuery.SQL.Add('ALARM_NAME VARCHAR(32),');
AlarmQuery.SQL.Add('ALARM_GROUP INTEGER,');
AlarmQuery.SQL.Add('ALARM_PRIORITY INTEGER,');
AlarmQuery.SQL.Add('ALARM_TYPE INTEGER,');
AlarmQuery.SQL.Add('ALARM_STATE INTEGER,');
AlarmQuery.SQL.Add('ALARM_VALUE FLOAT,');
AlarmQuery.SQL.Add('ALARM_LIMIT1 FLOAT,');
AlarmQuery.SQL.Add('ALARM_LIMIT2 FLOAT,');
AlarmQuery.SQL.Add('ALARMTIME DATETIME,');
AlarmQuery.SQL.Add('ACKTIME DATETIME,');
AlarmQuery.SQL.Add('NORMALTIME DATETIME,');
AlarmQuery.SQL.Add('ALARM_MSG VARCHAR(32),');
AlarmQuery.SQL.Add('USER_ACK VARCHAR(32))');
AlarmQuery.ExecSQL;
AlarmQuery.Close;
ZConnection1.Disconnect;
我的代码有什么问题?