今日、同僚が、Windows XP では機能するが Windows 7 では機能しないコードのエラーを報告してくれました。
ユーザーが「SalesOrdersystem」にログインできませんでした
私の物理的なデバッグは、閉じられたデータベース接続に対してクエリを実行していたか、開くのを忘れていたことを教えてくれました。
ADO2.6 以降、Windows Vista では、
PersistSecurityInfo
接続文字列の の既定値はFalse
ではなく ですTrue
。Windows Vista より前の接続文字列は次のとおりです。
Data Source=deathstar;User ID=SalesOrderSystem;Password=password1
接続が開かれた後、接続文字列にパスワードが保持されます。これは、次のようになります。
Data Source=deathstar;User ID=SalesOrderSystem; Password=password1;PersistSecurityInfo=true
Windows Vista 以降では、パスワードは既定で接続の
ConnectionString
プロパティから削除されます。Data Source=deathstar;User ID=SalesOrderSystem
これは
Data Source=deathstar;User ID=SalesOrderSystem; Password=password1;PersistSecurityInfo=false
パスワードが削除されるというこの動作が同僚に発生していることは知っていました。そして、接続が閉じられている間、彼は暗黙的に接続を開こうとするクエリ (つまり、ADOQuery.Open) を開こうとしています。しかし、接続文字列にパスワードが保存されていないと、元のエラーが発生します
質問は、「最初に開かずに接続を使用するのはなぜですか?」という質問になりました。
後で解放される接続を使用していた (マルチスレッド コード) までさかのぼって追跡しました。
疑似コード:
customer := TCustomer.Create(ADOConnection)
ADOConnection.Free;
customer.RefreshFromDatabase;
それよりも
customer := TCustomer.Create(DataModule.ADOConnection);
customer.RefreshFromDatabase;
冗談で、接続文字列を次のように変更することで、エラーをマスクし、クラッシュの可能性を残すことができると提案しましたPersistSecurityInfo=True
。
connectionString := ...+
';PersistSecurityInfo=True';
彼がしたこと。
内部でオブジェクトを使用するライブラリ コードがいくつかありADOConnection
ます。コードを次から変更できるようにしたいと思います。
destructor TAsyncFill.Destroy;
begin
...
FreeAndNil(FADOConnection)
end;
に
destructor TAsyncFill.Destroy;
begin
...
FADOConnection.Close;
FADOConnection.ConnectionString := 'This connection object has been freed. Why are you using it?';
FreeAndNil(FADOConnection);
end;
しかし、以前は機能していたエラーが発生すると確信しています。
私が考えているのはOnConnect
、接続オブジェクトにハンドラーを挿入できるある種のクロージャーです。
destructor Destroy;
begin
...
FADOConnection.Close;
FADOConnection.BeforeConnect := {
OutputDebugString('You''re using a connection that''s been freed!');
Windows.Beep(1000, 60000) };
FreeAndNil(FADOConnection);
end;
しかし、Delphi には匿名のイベント ハンドラがありません。
オブジェクトが解放された後、オブジェクトを使用しているときに人々に警告できる方法を考えられる人はいますか?
注:私が求めていることに対するサポートがないことを理解しています。現実の限界を考慮して、可能な限り最高のハックのアイデアを求めています。