TClientDataSet.RefreshRecordを使用するには?

解決


UII  2012-05-11 03:40:33  No: 42156

XE2で、SQLConnection1->SQLQuery1->DataSetProvider1->ClientDataSet1と接続しています。
DataSetProvider1.Options := [poAllowCommandText,poUseQuoteChar];
ClientDataSet1.CommandText := 'SELECT * FROM Employee' ;
ClientDataSet1.Open;
ClientDataSet1.RefreshRecord をすると「レコードが見つかりませんでした。キーを指定されていません」と表示されます。

キーはどこのコンポーネントでどう設定すればよいのでしょうか?
よろしくお願いいたします。


Atchoum  2012-05-12 02:53:06  No: 42157

ClientDataSet1.IndexFieldnamesで、
Employeeテーブルのキーをしてみてください。

EmployeeIDとかキーの名前をそのまま入れます。


UII  2012-05-12 21:15:58  No: 42158

Atchoumさん、ありがとうございます。
ClientDataSet1.IndexFieldnames := 'ID' (プライマリキー)を設定してみましたが、
結果は同じエラーが発生しました。

ちなみにDBはSQLServer2005とFireBird2.5でチェックしてみました。


Atchoum  2012-05-14 19:26:01  No: 42159

こんにちわ。

だめでしたか。
当方、Delphi2007、SQLServer2008です。

SQLQuery1.FieldsにProviderFlagsがあります。
キーになるフィールドにpfInKeyを「追加」してみてください。

SQLQueryダブルクリックするとField一覧が表示されるのでキーフィールドを選択すれば
ProviderFlagsが出てきます。

コードで書くとこんなふう。ここではiでまわしているんですが、うまくFieldを取得しpfInKeyを設定してください。
SQLQuery1.Fields[i].ProviderFlags := SQLQuery1.Fields[i].ProviderFlags + [pfInKey];

このときIndexFieldNameは設定したままにしておいてください。


UII  2012-05-14 23:50:44  No: 42160

Atchoumさん、こんにちわ。
SQLQuery1.FieldByName('ID').ProviderFlags := SQLQuery1.FieldByName('ID').ProviderFlags + [pfInKey]; で
ClientDataSet1.RefreshRecordできました。
ありがとうございます。

ただ、SQLServer2005で、ClientDataSet1.RefreshRecord後にデータ編集してClientDataSet1.ApplyUpdates(0)
すると下記エラーが発生します。  (FireBird2.5では問題なくうまくいきます)

SQL State:HY000, SQL Error Code: 0
Connection is busy with results for another command.


Atchoum  2012-05-15 00:16:20  No: 42161

あら〜このエラーは見たことないですね。

そのまま文字列検索したところ世界のみなさん同様のエラーでお困りのようです。たくさん検索ででてきました。下記はそのひとつです。
http://stackoverflow.com/questions/39928/how-to-fix-native-client-error-connection-is-busy-with-results-for-another-comm

上のページからマイクロソフトのページにジャンプすると
該当のエラーメッセージは「ほかのコマンドのために接続できません」と日本語で表示されるらしい。
http://support.microsoft.com/kb/822668
SQLServer2000ですが、バグのようです。2000のSP4で修正させれているよう。
http://support.microsoft.com/kb/888799/ja
サービスパックあてていますか?ご確認を。

私がお助けできるのはここまでのようです。
がんばってください。

解決したら、どのようにして解決したか記載していただけると助かります。


UII  2012-05-15 22:49:22  No: 42162

Atchoumさん、こんにちわ。

>サービスパックあてていますか?ご確認を。
SQLServer2005はSP4です。
SQLServer2008R2でもテストしましたが、やはりエラーが発生します。
コードは下記です。
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
  with ClientDataSet1 do begin
    Open;
    RecNo := 4;
    RefreshRecord;
    Edit;
    Fields[1].AsInteger := Fields[1].AsInteger + 1;
    Post;
    ApplyUpdates(0);  // <--ここで  Connection is busy with results for another command  エラー
  end;
end;

とりあえず、RefreshRecordメソッド自体はSQLServerでもFireBird2.5でも問題なくうまくいきますので
ClientDataSet1.RefreshRecordの使い方としては
SQLQuery1.Fields[i].ProviderFlags := SQLQuery1.Fields[i].ProviderFlags + [pfInKey];
で解決とさせて頂きます。

ありがとうございました。


UII  2012-05-15 22:52:41  No: 42163

解決のチェックを忘れました(^^;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加