2016-07-03 17 views
5

My Delphiプロジェクトには、MS Sql Server 2014サーバー上のTAdoQueryアクセスデータと、TDataSetProvider経由でAdoQueryデータを受け取るTClientDataSetがあります。これは私が設定したプロジェクトテンプレートから作成されます。TClientDataSet.ApplyUpdates()は更新を適用しません

通常、このセットアップは問題なく動作することがわかりましたが、この特定のプロジェクトでは問題があります.AppUpdates()はサイレントモードで失敗し、Sql Serverのデータは更新されません。私のダウン剥奪デバッグプロジェクト、私が持っている唯一のコードでは、離れてそれを呼び出すボタンクリックハンドラから、次のとおりです。

procedure TForm1.ApplyUpdates; 
var 
    Errors : Integer; 
begin 
    Errors := ClientDataSet1.ApplyUpdates(0); 
    Caption := IntToStr(Errors) + '/' + IntToStr(ClientDataSet1.ChangeCount); 
end; 

これが実行された後、フォームのキャプションはもちろんの0/0でなければなりませんが、何それは実際に言います0/1です。そのため、エラーは発生していませんしかし CDS ChangeCountはゼロにリセットされていません。私の質問は、どのようにApplyUpdatesがエラーを返すことができますが、サーバーのデータセットは更新されません。

Fwiw、問題をデバッグするための努力の一環としてChangeCountディスプレイを追加しました。しかし、私は、DataSetProviderとそのDataSet間の "会話"の詳細について、サーバー上で更新を適用するために行われていることに従うことができなかったのではないかと心配しています。

+1

エラーハンドラOnReconcileErrorのコードを追加しましたか? – mjn

答えて

5

最近、私は、@ mjnによって照会されるように、OnReconcileErrorハンドラを設定する予防措置を取らずに簡単なプロジェクトでこの問題に遭遇しました。

一度OnReconcileErrorハンドラを設定すると、プロバイダのTSqlResolverが更新する行を識別できないという問題が明らかです。 Iirc、ReconcileErrorポップアップフォームのメッセージは、「レコードを見つけることができませんでした。キーが指定されていません。だから、私が試した最初の事は私のCDSのAfterOpenでこれを含めることでした

CDS1.Fields[0].ProviderFlags := [pfInKey]; 

(CDS1.Fieldsが[0]のデータセットのPKフィールドである)

反して私の期待に、それはそれを修正しませんでした。しばらく私の頭を傷つけた後、私はサーバーを慎重に見て、私が使っていた最近再現されたテーブルに主キーインデックスがないことを発見しました。

サーバーで主キーインデックスを作成すると、ApplyUpdatesの問題は解決されました。

しかし、これについて私が疑問に思うのは、あなたのqによってプロンプトが出され、プライマリキーのインデックスを私のサーバテーブルに落としてしまい、問題が再び発生し始めていない(!)。私はこれは私のマシン上のキャッシュ効果のいくつかの種類のためですが、私は本当に調査するために今すぐ再起動したくないと思います。

関連する問題