1

我正在编写一个简单的数据库编辑器作为我的第一个 Delphi 程序。

我对 Delphi 没有任何问题,只有通过数据库连接。

我将数据加载到数据网格中-> sqlConnection -> sqlDataSet -> sqlDataprovider -> Clientdataset -> Datasource

我使用单独的连接 +SqlQuery为每个记录插入/删除记录。

我用 DBEdit 更改记录

当我插入/删除记录后,我对记录进行了更改,并想要更新更改时出现问题,我收到以下错误

连接正忙于其他命令的结果。

代码:

procedure TDatabaseApp.bNieuwClick(Sender: TObject);
begin

//Waardes invullen in de query statement!

SQLInsert.ParamByName('naam').asString := txtNaam2.Text;
SQLInsert.ParamByName('brouwernr').asString := txtBrouwerNR.Text;
SQLInsert.ParamByName('soortnr').asString := TXTSoortNR.Text;
SQLInsert.ParamByName('alcohol').asString := TxtAlcohol.Text;

//query
SQLInsert.ExecSQL();
SQLInsert.Close();

//Reload datagrid after record has been inserted!
Refresh();

end;

刷新代码

procedure   TDatabaseApp.Refresh();
begin

//After a insert/delete query i call this statement, and changes made with the DBEdit are cancelled = temp solution.
  ClientDataSet1.CancelUpdates();  

  SQLDataSet1.Open();
  ClientDataSet1.Open();
  SQLDataSet1.Refresh();
  ClientDataSet1.Refresh();
end;
4

1 回答 1

1

由于您的 ClientDataSet 链接到您的 DataSetProvider 并且您的 DataSetProvider 链接到您的 SQLDataSet,因此您永远不应该直接操作 SQLDataSet,而是使用 ClientDataSet 执行所有操作。

因此,您将拥有:

procedure TDatabaseApp.Refresh();
begin
    //ClientDataSet1.CancelUpdates();  //will raise an error depends on the CDS state
    ClientDataSet1.Close;  
    ClientDataSet1.Open();

    //SQLDataSet1.Open(); //not necessary, as you already open the CDS
    //SQLDataSet1.Refresh(); //not necessary, as you already open the CDS
    //ClientDataSet1.Refresh(); //not necessary, as you already open the CDS
end;

但我建议您也使用 CDS 进行插入,放弃使用“SQLInsert”对象。这样,事情就会变得简单得多。

于 2012-05-29T12:16:33.073 回答