XE2で、SQLConnection1->SQLQuery1->DataSetProvider1->ClientDataSet1と接続しています。
DataSetProvider1.Options := [poAllowCommandText,poUseQuoteChar];
ClientDataSet1.CommandText := 'SELECT * FROM Employee' ;
ClientDataSet1.Open;
ClientDataSet1.RefreshRecord をすると「レコードが見つかりませんでした。キーを指定されていません」と表示されます。
キーはどこのコンポーネントでどう設定すればよいのでしょうか?
よろしくお願いいたします。
ClientDataSet1.IndexFieldnamesで、
Employeeテーブルのキーをしてみてください。
EmployeeIDとかキーの名前をそのまま入れます。
Atchoumさん、ありがとうございます。
ClientDataSet1.IndexFieldnames := 'ID' (プライマリキー)を設定してみましたが、
結果は同じエラーが発生しました。
ちなみにDBはSQLServer2005とFireBird2.5でチェックしてみました。
こんにちわ。
だめでしたか。
当方、Delphi2007、SQLServer2008です。
SQLQuery1.FieldsにProviderFlagsがあります。
キーになるフィールドにpfInKeyを「追加」してみてください。
SQLQueryダブルクリックするとField一覧が表示されるのでキーフィールドを選択すれば
ProviderFlagsが出てきます。
コードで書くとこんなふう。ここではiでまわしているんですが、うまくFieldを取得しpfInKeyを設定してください。
SQLQuery1.Fields[i].ProviderFlags := SQLQuery1.Fields[i].ProviderFlags + [pfInKey];
このときIndexFieldNameは設定したままにしておいてください。
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.
あら〜このエラーは見たことないですね。
そのまま文字列検索したところ世界のみなさん同様のエラーでお困りのようです。たくさん検索ででてきました。下記はそのひとつです。
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
サービスパックあてていますか?ご確認を。
私がお助けできるのはここまでのようです。
がんばってください。
解決したら、どのようにして解決したか記載していただけると助かります。
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];
で解決とさせて頂きます。
ありがとうございました。
解決のチェックを忘れました(^^;
ツイート | ![]() |