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;

ただし、「SQLInsert」オブジェクトの使用をやめて、挿入にも CDS を使用することをお勧めします。このようにして、物事ははるかに簡単になります。

于 2012-05-29T12:16:33.073 に答える