0

我在 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;

我的代码有什么问题?

4

0 回答 0