BDEのTQueryのOpen時のエラーについて


今更BDE  2015-10-01 02:18:35  No: 47644

実行環境によって、BDEでParadoxをTQueryでClose-Openを繰り返すとエラーが発生する現象が発生しています。
どなたか、アドバイス頂ける方、アドバイスお願いします。
正常動作する環境は、WinXP(Pro)+Delphi2007の環境では、問題発生していません。
問題は、Win7(32bitPro)+Delphi2007で、例外が発生します。
例外クラスEDatabaseError この機能は使用できません とデバッカ例外通知が表示されます。
エラーコードを抽出するようにすると、$3001が出力されます。
関連するキーワードを元にgoolgeで検索し、いろいろと試してみましたが、失敗で終わっている状態です。


通りすがり  2015-10-01 03:41:39  No: 47645

状況がよくわかりませんね。最低限n(ry

とりあえず、
BDEは最新(5.2)ですか?
エラーが発生するのはOpenですか?Closeですか?
Handling the "Capability not supported" error http://edn.embarcadero.com/article/25183 は参考になりませんか?
Pseudo-random tech thoughts: BDE and Windows 7, 32 and 64 bits http://alexandrecmachado.blogspot.jp/2012/01/bde-and-windows-7-32-and-64-bits.html はどうですか?
例外を送出しているのはDB.pasのDatabaseError関数ですが、例外発生時の呼び出し履歴でDatabaseErrorを呼び出しているのはどのような処理経路ですか?


今更BDE  2015-10-01 18:23:26  No: 47646

通りすがり さん、書込みありがとうございます。

とりあえず、以下に回答させて頂きます。

>BDEは最新(5.2)ですか?
BDEのバージョンは、5.2です。(Delphi2007インストール時のまま)
BDE AdministratorのBDEバージョン情報を確認し、IDPDX32.DLLのバージョン番号は5.2.0.2(N/A)と表示されます。

>エラーが発生するのはOpenですか?Closeですか?
エラー発生状況は、Open時です。(デバッカで確認済み)

>Handling the "Capability not supported" error http://edn.embarcadero.com/article/25183 は参考になりませんか?
これが一番怪しいと思い試していました。
BDE Administrator で環境設定-System-INIT-SQLQRYMODEをLOCALに設定して試していますが、効果は無しです。

>Pseudo-random tech thoughts: BDE and Windows 7, 32 and 64 bits http://alexandrecmachado.blogspot.jp/2012/01/bde-and-windows-7-32-and-64-bits.html はどうですか?
これは、知りませんでした。インストールが伴うため、試した方が良いか判断できませんので、まだ、未確認です。

>例外を送出しているのはDB.pasのDatabaseError関数ですが、例外発生時の呼び出し履歴でDatabaseErrorを呼び出しているのはどのような処理経路ですか?
以下のURLの内容を参考に対応しました。(Delphi Tips - EDBEngineError 例外の処理 )
http://support.embarcadero.com/jp/article/35954

コードを抜き出すと以下のとおりです。
if Query1.Active = True then
begin
    Query1.Close;
    if Query1.Active = False then
    begin
        try
            Query1.Open;
        except
            on E: EDBEngineError do
                ShowError(E);
        end;
    end;
end;

procedure TForm1.ShowError(AExc: EDBEngineError);
var
  i: Integer;
begin
    Memo1.Lines.Clear;
    Memo1.Lines.Add('エラーの数: ' + IntToStr(AExc.ErrorCount));
    Memo1.Lines.Add('');
    { Errors 配列プロパティを順にたどる }
    for i := 0 to AExc.ErrorCount - 1 do
    begin
      Memo1.Lines.Add('メッセージ: ' + AExc.Errors[i].Message);
      Memo1.Lines.Add('  カテゴリ: ' + IntToStr(AExc.Errors[i].Category));
      Memo1.Lines.Add('  エラーコード: ' + IntToStr(AExc.Errors[i].ErrorCode));
      Memo1.Lines.Add('  サブコード: ' + IntToStr(AExc.Errors[i].SubCode));
      Memo1.Lines.Add('  サーバーエラーコード: '
                      + IntToStr(AExc.Errors[i].NativeError));
      Memo1.Lines.Add('');
    end;
end;

私自身は、BDE Administratorの設定やTQueryのプロパティの設定で何とかなると試しているところです。
お問い合わせについて、そのままの回答になりますが、以上の状況です。


Harry  2015-10-04 19:13:37  No: 47647

私はデータベース関係の知識がぜんぜんありませんが、それでもよろしければ。

>例外を送出しているのはDB.pasのDatabaseError関数ですが、
>例外発生時の呼び出し履歴でDatabaseErrorを呼び出しているのはどのような処理経路ですか?

通りすがりさんが↑このように問いかけているのはエラー発生箇所のコードのことではなく、
例外発生時にブレークしたときの「呼び出し履歴」ウインドウのことだと思います。
そこの内容を見れば、例外発生の現場となったメソッドが見つかるはずです。それをソースで
確認するだけで、例外発生の直接の原因が判明するかもしれません。

しかし直接の原因の候補が複数あるかもしれませんし、真の原因は捉えられないかもしれません。
その場合はプロジェクトオプションで「デバッグ版DCUの使用」にチェックを入れ、ブレーク
ポイントとトレース実行やステップ実行を駆使して探すことになるでしょうか。

また、いつも言われてることですが、どうにも分からない場合には新規のプロジェクトを作り、
問題が再現できる(極限まで削った)最小限のコードを書いてみると良いとのことです。
最小限のコードを書いている過程で、自然と問題ポイントが判明することも多いとかなんとか。


DEKO  2015-10-05 23:53:19  No: 47648

アプリケーションを [管理者として実行] で実行してもエラーは出ますか?


今更BDE  2015-10-06 02:39:16  No: 47649

Harryさん、DEKOさん、書込み書込み、ありがとうございます。

現在、Harryさんの書込みを参考にして、デバッカ上で絡まった紐を丁寧に解く様に、コツコツと動作確認を行っているところです。

DEKOさんの、アプリケーションを [管理者として実行] で実行してもエラーは発生します。
ただし、発生するタイミングはTQueryのCloseしOpenする処理を700回程度は問題ありませんが、700回程度を超えると、CloseしてOpenしたタイミングでエラーが発生します。
また、UACを無効(「ユーザアカウント制御の設定」で、「通知しない」)に設定しています。

今、デバッカ上で確認している感じだと、ハンドルやセッションに関連する箇所でエラー発生している様な状況です。
詳しい状況を確認するには、もう暫く時間がかかりそうそうです。

書込みや状況変化がありましたら、書込みを行う予定です。


Harry  2015-10-06 07:52:48  No: 47650

先の投稿では、デバッグ方法について、かなりはしょってお伝えしました。
もう相当にデバッグを進めておられるようなので蛇足だとは思いますが、念のため補足を。

・ ブレーク時の「呼び出し履歴」ウインドウは、各行のダブルクリックで該当ソースが表示されます。
・ トレース/ステップ実行の他、「呼び出し元に戻るまで実行」も便利です。
・ ブレークポイントを設定すると、「ブレークポイント一覧」に表示されます。そのプロパティで
「ブレーク条件」を設定すれば、条件に一致する時だけブレークさせられるので便利です。
・ もちろん、「監視式一覧」や「ローカル変数」と併用すればより詳しく状況がつかめると思います。
・ 「ブレークポイント一覧」や「監視式一覧」がどこかに消えてしまった場合は、デスクトップの
レイアウト(「デスクトップツールバー」と言うらしい)で「Debug Layout」を選択するか、メニューの
表示→デバッグ で表示できます。

なお、、、デバッグの結果、真の原因が突き止められ、それによって適切な対処/修正が行えれば良い
のですが、逆に「プログラマ側では対処不可能であることが判明」という結末もあり得ると思います。
努力が報われることをお祈りしております。


DEKO  2015-10-06 08:52:11  No: 47651

1.
デバッグ実行ではなく (IDE からの起動ではなく) 、
アプリケーションを単体実行してもエラーは出るのでしょうか?

2.
ReportMemoryLeaksOnShutdown := True;
を追加した場合、メモリリークは検出されますか?

3.
Query1 をフォームに貼るのではなく、ロジック中で
動的生成して破棄するようにしてみたら症状は緩和されるでしょうか?


今更BDE  2015-10-06 18:09:06  No: 47652

次のとおり、状況報告します。

Harryさん、書込み、ありがとうございます。
結果として、報われるかは、わかりませんが、
デバック方法も参考にして、引き続き、地道な作業を行います。

続いて、
DEKOさん、書込み、ありがとうございます。
http://ht-deko.com/tech024.html も参考に拝見させて頂きました。
現状は次のとおりです。
>1.
>デバッグ実行ではなく (IDE からの起動ではなく) 、
>アプリケーションを単体実行してもエラーは出るのでしょうか?
実行方法は、エクスプローラ上から、実行するEXEファイルを右クリックして、
「管理者として実行(A)...」を選択し、実行しました。
また、EXEファイルのプロパティの「互換性」タグの特権レベルを「管理者としてこのプログラムを実行する」にチェックを付け(有効にして)、
EXEファイルを実行してみたりして試しましたが、同じ例外(エラー)が発生します。

>2.
> ReportMemoryLeaksOnShutdown := True;
>を追加した場合、メモリリークは検出されますか?
こちらは、試していませんので、試してみます。

>3.
> Query1 をフォームに貼るのではなく、ロジック中で
>動的生成して破棄するようにしてみたら症状は緩和されるでしょうか?
これは思いつきませんでした。これも2.の次に試してみます。

以上の状況です。
今後、書込みや状況変化がありましたら、書込みを行う予定です。
皆様、ご協力、ありがとうございます。


今更BDE  2015-10-06 19:04:36  No: 47653

DEKOさん、1つ、状況報告します。

>2.
> ReportMemoryLeaksOnShutdown := True;
>を追加した場合、メモリリークは検出されますか?
上記について、以下の内容を参考にして、実施した結果、確認できました。
http://mrxray.on.coocan.jp/Delphi/Others/UsageFastMM.htm

結果は、「Unexpected Memory Leak」のポップが表示され、
メッセージは、「An unexpected memory leak has occurred. The unexpected small block leaks are:
21 - 28 bytes:TCriticalSection x 1」と表示され、TCriticalSectionでメモリリークが発生しているのがわかりました。

クリティカル セクションの使用について、確認してみます。

現在の状況の変化は以上です。


今更BDE  2015-10-07 02:22:00  No: 47654

メモリリークについて確認しました。

特定方法で少しはまってしまい、少々、時間がかかりました。
結果、ログ出力する様にして、特定はできました。
直接な影響が少なそうなので、この件は一旦保留して、他のことを確認する予定です。

こちらも参考になりました。
http://edn.embarcadero.com/jp/article/33696

以上が、状況報告になります。


tor  2015-10-07 03:07:57  No: 47655

ときに、コードを見ると色々な情報を取り出しているようですが……
ヲサヲサヲサヲサヲサヲサナヲサ配列プロパティを順にたどるヲサ
ヲサヲサヲサヲサヲサヲサヲサコスヲサーヲサヲサチナョナテヲサュヲサアヲサ
ヲサヲサヲサヲサヲサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァメッセージコヲサァヲサォヲサチナョナロンョヘゥサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァヲサヲサカテゴリコヲサァヲサォヲサノヤモィチナョナロンョテゥゥサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァヲサヲサエラーコードコヲサァヲサォヲサノヤモィチナョナロンョナテゥゥサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァヲサヲササブコードコヲサァヲサォヲサノヤモィチナョナロンョモテゥゥサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァヲサヲササーバーエラーコードコヲサァ
ヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサヲサォヲサノヤモィチナョナロンョホナゥゥサ
ヲサヲサヲサヲサヲサヲサヲサヘアョフョチィァァゥサ
ヲサヲサヲサヲサヲササ

ヲサヲサ例外クラスナトナヲサこの機能は使用できませんヲサとデバッカ例外通知が表示されます。
ヲサヲサエラーコードを抽出するようにすると、、ウーーアが出力されます。
、ウーーアというのはナテソヲサ他の情報はどうだったのでしょうか。

ナテステォモテヲサだから、他イつはあまり意味がないとして
(ちなみにヘルプのすすめに従ってツトナョを見ると、、ウーーアはヲサナメメツチモナ゜テチミチツノフノヤルヲサォヲサナメメテマトナ゜ホマヤモユミミマメヤナトヲサのようです)
ホナは何か役に立つものが入っていそうで気になりますよね!ヲサなりません?ヲサ私は興味津々です!
あと、チナに入っていたエラーはアつだけだったのでしょうかソ

ついでに
ヲサヲサネヲサヲサ「テヲサヲサ「ヲサヲサコッッョョッッイオアクウヲサは参考になりませんか?
ヲサこれが一番怪しいと思い試していました。
ヲサヲサヲサツトナヲサチヲサで環境設定ュモュノホノヤュモムフムメルヘマトナをフマテチフに設定して試していますが、効果は無しです。
というのは何か的外れのような気が……(このケースだと、むしろ真のエラーを返してもらうためにモナメヨナメにするのが正解では……)
ページの最後の方に「ミの場合、ョファイルを探して消してみては」的なコメントが付いてますけど、それは試してみました?
スススススススススススススススススススススススススススススススススススススススス
ニコ 今更BDE
トコ イーアオッアーッーキィ水ゥ アイコウウコイエ  書込者ノト:ロ 「「。  ン

さん、書込み、ありがとうございます。
現状を回答させて頂きます。

ヲサ、ウーーアというのはナテソヲサ他の情報はどうだったのでしょうか。
いきなり、、ウーーアといきさつを省略していました。
エラーコードは、アイイクケ(10進数)となり、アカ進数だと、ウーーアなりますので、、ウーーアの表現で書込みました。
カテゴリはエク(10進数)でアカ進数だと、ウーとなり、サブコードはア(10進数)で、ーアとなり、
ご指摘のとおり、結果としては、テォモテの部分はあまり意味がなかったようです。
ヲサナテステォモテヲサだから、他イつはあまり意味がないとして
ヲサ(ちなみにヘルプのすすめに従ってツトナョを見ると、、ウーーアはヲサナメメツチモナ゜テチミチツノフノヤルヲサォヲサナメメテマトナ゜ホマヤモユミミマメヤナトヲサのようです)
ヲサホナは何か役に立つものが入っていそうで気になりますよね!ヲサなりません?ヲサ私は興味津々です!
ヲサあと、チナに入っていたエラーはアつだけだったのでしょうかソ
表示の結果は、以下のとおりでした。

エラーの数コヲサア

メッセージコヲサこの機能は使用できませんョ
ヲサヲサカテゴリコヲサエク
ヲサヲサエラーコードコヲサアイイクケ
ヲサヲササブコードコヲサア
ヲサヲササーバーエラーコードコヲサー

ヲサついでに
ヲサヲサヲサネヲサヲサ「テヲサヲサ「ヲサヲサコッッョョッッイオアクウヲサは参考になりませんか?
ヲサヲサこれが一番怪しいと思い試していました。
ヲサヲサヲサヲサツトナヲサチヲサで環境設定ュモュノホノヤュモムフムメルヘマトナをフマテチフに設定して試していますが、効果は無しです。
ヲサというのは何か的外れのような気が……(このケースだと、むしろ真のエラーを返してもらうためにモナメヨナメにするのが正解では……)
ヲサページの最後の方に「ミの場合、ョファイルを探して消してみては」的なコメントが付いてますけど、それは試してみました?
こちらも結果のみを書き込んでいますので、補足します。
詳細を事細かく、結果のみで伝わりづらくなっていた様です。
モムフムメルヘマトナをモナメヨナメとフマテチフで結果は、同じで、ミはマトツテなど不要なローカルDBなため、回避策としては、モムフムメルヘマトナをフマテチフにしても効果無し。と書込みました。
また、日付の古いョのファイルがあり削除してしましたが、その後、作成せれず、特に効果はありませんでした。

以上が、補足説明となります。
その他の新たな進展はありません。
今後、書込みや状況変化がありましたら、書込みを行う予定です。
皆様、ご協力、ありがとうございます。
スススススススススススススススススススススススススススススススススススススススス
ニコ 今更BDE
トコ イーアオッアーッークィ木ゥ ークコウイコウカ  書込者ノト:ロ 「「。  ン
モコ 

皆様、ご協力、ありがとうございました。

別の問題は残りますが、・・・。
ある意味、悲しい結末ですが...。

結果、ヤムに使用しているモムフ文のマメトナメヲサツル句を削除したら、
以前、キーー回位を繰り返したところでエラー(例外)が発生していたものが、
アーーー回を超えても正常にヤムのテュヲサマを繰り返すことが可能になりました。
なぜ、途中まで処理できて、ある段階で異常になるのかは、疑問のままとなりますが...。
それは、またの時間に余裕があるときになるかと思います。

気付いた、きっかけは、些細なことで、
他のフォームでも、フォーム内で同一のテーブルをヤヤとヤムで使用するものがあり、
そのプログラムを確認したところ、モムフ文が異なっていましたので、同様にしたところです。

別の問題については、別件で起案する予定です。
元々、ヤムで実現したかったことは、レコードをフィールドの降順に並べてデータ抽出するつもりで、
モムフ文にマメトナメヲサツル句を付与し、処理してました。

ここで、一旦、終了させて頂きます。
また、新たな問題について、起こしますます。
ご協力可能な方は、ご意見でもかまいませんので、ご協力をお願いします。


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

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






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