记录提交后 Lazarus DBGrid 完全空白

Lazarus DBGrid totally blank after record commit

我一直在使用 Lazarus 2.x (free pascal) with firebird 3(通过 flamerobin),我尝试通过数据模块(上诉)中的 TSQLConnection、TSQLQuery、TDBConnection 等提交记录

我运行以下代码片段和记录已成功提交给firebird,但不幸的是之后数据库连接丢失,因此通过DBGrid看不到任何记录(甚至列headers - 完全空白)。我必须终止应用程序并重新打开它才能通过 DBGrid 直观地了解我的 firebird。

按钮点击事件

  appeals.SQLTransaction1.Active:=false;

  appeals.SQLQuery1.SQL.Text:='UPDATE appeals set name=:name,date_entry=:entry,date_suspended=:suspended,'+
  'date_court=:court,date_judgement=:judgement where id='+IntToStr(row_num);

  appeals.SQLQuery1.Params.ParamByName('name').AsString:=Trim(Edit1.Text);
  appeals.SQLQuery1.Params.ParamByName('entry').AsDate:=DateTimePicker1.Date;
  appeals.SQLQuery1.Params.ParamByName('suspended').AsDate:=IncDay(DateTimePicker1.Date,10);
  appeals.SQLQuery1.Params.ParamByName('court').AsDate:=DateTimePicker2.Date;
  appeals.SQLQuery1.Params.ParamByName('judgement').AsDate:=IncDay(DateTimePicker2.Date,20);

  appeals.SQLTransaction1.StartTransaction;
  appeals.SQLQuery1.ExecSQL;
  appeals.SQLTransaction1.Commit;

我也使用了 .CommitRetaining,正如 lazarus 论坛中提到的那样,但没有成功。知道我该怎么做才能在提交后在 DBGrid 中看到我的记录。

此致

DBgrid 什么都不显示的原因是 SqlQuery1.ExecSQL 没有 return 结果集,因此 SqlQuery1 无法提供任何记录供 DBGrid 显示。所以在提交后调用 SqlQuery1.Open。

然而,在你调用SqlQuery1.Open之前,你需要给它一个SELECT语句来执行,因为SQL UPDATE语句不会return一个结果设置,正如您已经发现的那样。所以,做这样的事情:

  [...]
  appeals.SQLTransaction1.StartTransaction;
  appeals.SQLQuery1.ExecSQL;
  appeals.SQLTransaction1.Commit;

  appeals.SQLQuery1.Sql.Text := 'Select * from appeals where ...';
  appeals.SQLQuery1.Open;

显然用适当的东西替换 'where' 子句中的“...”。通常情况下。 SELECT 查询应参数化以限制行数 returned 和 table 在服务器上锁定的时间。