TADOQueryのエラーを回避する方法

解決


ロン  2007-10-24 00:14:18  No: 28090

いつもお世話になっています。

TADOQueryを使用して下記のようにデータ検索をしようとしていますが、取得対象のレコードがない場合に、最後のCloseで「BOFとEOFのいずれかがTureになっているか、または現在のレコードが削除されています。要求された操作には、現在のレコードが必要です。」とのメッセージのエラーがでます。
プロパティの設定などでエラーを回避する方法はないでしょうか?

  with ADOQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select * ');
    SQL.Add(' From SSS');
    SQL.Add(' Where AA = ''Z''');
    try
      Open;
      First;
    except
      on E:Exception do
      begin
      end;
    end;
    Close;    //←ここでエラー
  end;


SAKURA  2007-10-24 01:10:24  No: 28091

Firstでエラーになっているとか・・・

Open;
if not EOF then begin
end;


SAKURA  2007-10-24 01:11:35  No: 28092

途中で送ってしまいました。。。
Firstでエラーになっているとか・・・

Open;
if not EOF then begin
   First;
end;
Close;

では、どうでしょう?
違ってたらすみません・・・


ロン  2007-10-24 03:17:55  No: 28093

ご回答ありがとうございます。

ただ残念ながら

if not EOF then
   First;

を入れてみてもダメでした。
どうもデータが1件も取得できなかった場合か、EOF=True の場合にエラーが出ているようです。

そのため、データが取得できた場合でも、

while not EOF do
begin
  〜
end;

で取得データを全てなめた後でCloseの場合もエラーになります。
原因がつかめません・・・。
あ、ちなみに使用しているDelphiのバージョンは5です。


めるめる  2007-10-24 04:12:25  No: 28094

私は下記のようにしていますが、
ゼロ件の場合でも特に問題は発生していません。
WinXP + D7 + Jet4.0/mdb
WinVISTA + D2007 + Jet4.0/mdb
どちらでも問題ないようです。

var
  Wstr: String;
begin
  Wstr := '';
  Wstr := Wstr + 'SELECT *';
  Wstr := Wstr + ' FROM SSS';
  Wstr := Wstr + ' WHERE AA = ''Z''');

  ListBox1.Clear;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(Wstr);
  ADOQuery1.Open;

  if (ADOQuery1.Eof) then
  else
  begin
    ADOQuery1.First;
    while not ADOQuery1.Eof do
    begin
      ListBox1.Items.Add(ADOQuery1.FieldByName('AA').AsString);
      ADOQuery1.Next;
    end;
  end;
  ADOQuery1.Close;

  Label1.Caption := '(' + IntToStr(ListBox1.Count) + '件)';
end;


pekesuke  2007-10-24 17:28:28  No: 28095

CODE GEARの登録ユーザー向けダウンロードから、Delphi 5 ADOExpress Update Packをダウンロードして実行してください。
> このアップデートによって解決される問題

> MDAC 2.6 との互換性
> -------------------
>  
> このアップデートにより、MDAC 2.6 上で実行される
> ADOExpress アプリケーションの問題が修正されます。
> 具体的には、空のデータセットを閉じる際に「EOF と
> BOF の両方が True であるか、現在のレコードが削除
> されました。要求された操作は現在のレコードが必要
> です」というエラーが発生するというものです。
> 同様のエラーは、編集操作のキャンセル時にも発生
> します。アップデートが完了したら、アプリケーション
> を再構築してください。


ロン  2007-10-24 23:13:28  No: 28096

Delphi側のバグだったのですね・・・。
上記のものをアップデートしたら正常に動きました。
助かりました。ありがとうございました。


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

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






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