Lazarus DBGrid полностью пуст после фиксации записи - PullRequest
0 голосов
/ 29 мая 2020

Я использовал Lazarus 2.x (бесплатно pascal) с firebird 3 (через flamerobin), и я пытаюсь фиксировать записи через TSQLConnection, TSQLQuery, TDBConnection в данных модуль (апелляции) et c.

Я запускаю следующий фрагмент кода, и записи успешно передаются в firebird, но, к сожалению, впоследствии соединение с БД теряется, и, таким образом, через DBGrid ( даже не заголовки столбцов - полностью пустые). Мне нужно закрыть приложение и снова открыть его, чтобы получить визуальное представление о моем firebird через DBGrid.

Событие нажатия кнопки

  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 после фиксации.

С уважением

1 Ответ

0 голосов
/ 29 мая 2020

Причина, по которой DBgrid ничего не показывает, заключается в том, что SqlQuery1.Exe cSQL не возвращает набор результатов, поэтому SqlQuery1 не может предоставить какие-либо записи для отображения DBGrid. Поэтому вызовите SqlQuery1.Open после фиксации.

Однако, прежде чем вы сможете вызвать SqlQuery1.Open, вам необходимо передать ему оператор SELECT для Execute, потому что оператор SQL UPDATE не возвращает набор результатов, как вы уже нашли. Итак, сделайте что-нибудь вроде:

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

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

, очевидно, заменив '...' в предложении 'where' чем-нибудь подходящим. Как обычно. запрос SELECT должен быть параметризован, чтобы ограничить количество возвращаемых строк и время, в течение которого таблица заблокирована на сервере.

...