我正在编写一个简单的数据库编辑器作为我的第一个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;
而您的 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"对象。这样事情就会变得简单得多。