SQlite3:EDatabase错误 - 查询 - 无法对已关闭的数据集

时间:2015-04-23 13:20:13

标签: sql database delphi sqlite zeos

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

我的代码出了什么问题?

0 个答案:

没有答案