1

Delphi7でADOデータベースプロファイラーを作成しようとしています。これはDelphiプロジェクトの一部です。

イベントを使用してOnExecuteCompleteいますが、一部のPCで「MSADO15.DLL」アクセス違反エラーが発生します。

私は調査し、いくつかの勝利バージョンが互換性がないか、破損しているか、バージョンが異なることを過小評価しています。

parameters[i].value「コマンド」のプロパティを使用すると、そのAVエラーが発生しました。次に、別のタイプを作成することにしOnExecuteCompleteました。ここで、ADOConnectionでイベントを呼び出したオブジェクトへの参照が必要です。到達できれば問題は解決します。

「Command」と「Recordset」の参照を使用して、このADOConnectionによってリンクされたすべてのADOオブジェクトで比較しますが、一部のADOオブジェクトにはRecordsetがありません。そのイベントを発生させたユーザーを見つける方法はありますか?送信者のように?

4

4 に答える 4

1

私はそれを解決します!ADOQueryとADOStoredProcから派生した2つのクラスを作成します。次に、それらのCommandプロパティを公開します。StoredProcedureを新しいクラスに強制的に変換することで、コマンドプロップに到達し、イベントのコマンドオブジェクトで比較します。問題が解決しました!皆さん、ありがとうございました。

于 2012-07-07T22:17:25.607 に答える
1

あなたが.Netにいるかどうかはわかりませんでしたが、.Netでは簡単です。System.Diagnostics.StackTraceを使用して、イベントにつながる呼び出しのスタック全体を確認します。

ネイティブコードの場合、デバッグモードでコンパイルすると、スタックトレースを取得する方法もおそらくあります。Delphi(またはPascal)コードを書いたので、かなり時間がかかります。また、コールグラフ機能も備えたDelphi(ネイティブと.Netの両方)でうまく機能する無料のAQTime標準を使用してプロファイリングを試すこともできます。

于 2012-07-07T16:09:51.047 に答える
1

WindowsXP、Windows 2003のみが、Parameters [i] .Valueを読み取り、レコードセットを表示した後、「MSADO15.DLL」アクセス違反エラーの問題を抱えています。Windows7にはこの問題はありません。WillExecuteイベントを使用します-どこでも正常に機能します。ExecuteCompleteでは、recordsetからrecordsAffectedを取得する場合があります(RecordsAffectedバリアントは正しく機能しません)。パラメータをバリアント変数に保存し、ビジュアルコンポーネントがレコードセットを表示した後でそれを読み取る場合は、後でParameters [i] .Valueを取得できます。たとえば、OnButtonClickまたはTimerイベントを使用します。このバグは、すべてのDelphiバージョンで修正されているわけではありません。DelphiXE2でも修正されています。

于 2012-08-18T19:55:55.117 に答える
0

それがゼロでない場合、送信者はあなたに手がかりを与えるはずです。それをTComponentにキャストし、そのNameプロパティを使用して、どのコンポーネントがそれを起動したかを調べます。

ShowMessage((Sender as TComponent).Name);

Senderがnilの場合、スタックトレースが役立つ可能性があります。

アップデート

どうやらSenderパラメータはありません。この場合、Connectionはそれを起動するクラスである必要があるため、その名前とその他のデータを取得します。何が起こっているのかを知るのに十分なパラメータを取得します。

于 2012-07-07T03:30:21.680 に答える