いくつかの支援を提供できる人に感謝します...
バックグラウンド:
Borland Delphi v6 でコーディングされ、まだサポートされているアプリケーションがあります。ごく最近、TADOStoredProc クラスがストアド プロシージャの実行に失敗するという問題がありました。このコードは、以前は数年間安定しており、変更されることはありませんでした。
要求のタイムアウトを構成できますが、これは尊重されますが、タイムアウトが非常に長くても、ストアド プロシージャの呼び出しは実行されません。アプリケーションがハングアップするか、タイムアウト例外でベイルします。(サーバーに過負荷がかかっておらず、同じクライアントから発信された他の SQL SELECT 要求に応答することはわかっています。)
D6が古いことは知っています。Embarcadero RAD Studio XE2 を使用した別の環境で、同じプロジェクトをビルドすることができましたが、同じ問題がまだ残っています。... 念のため。
どこへ行く?
- 提供されたコードを確認し、より良い方法がないかどうかを確認してください。(最近の更新後、MSSQL インターフェースがよりうるさいのではないでしょうか?) 私は確かに推奨事項を歓迎します。
- 信頼性が高く、TADOStoredProc を必要としない、アプリにプラグインできる別の方法はありますか? 掘り下げましたが、良い例は見つかりませんでした。
コード例
function TImport.OpenHeader(DriverID: Integer, …, ScanStart: DateTime, ...): integer;
var
suid: integer;
jid: integer;
con : TADOConnection;
sp : TADOStoredProc;
begin
suid := getScanUnitID();
jid := deriveJobID(ScanStart);
con := TADOConnection.Create(nil);
con.LoginPrompt := false;
con.ConnectionString := 'Provider=SQLOLEDB.1;Password=<testPwd>;Persist Security Info=True;User ID=<testUser>;Initial Catalog=<myDB>;Data Source=<myServer>';
con.CommandTimeout := 10;
con.KeepConnection := true;
con.Connected := true;
sp := TADOStoredProc.Create(nil);
sp.Connection := con;
sp.CommandTimeout := 10;
sp.ProcedureName := 'mon4_OpenHeader;1';
sp.Parameters.Refresh;
sp.Parameters.ParamByName('@ScanUnitID').Value := suid;
sp.Parameters.ParamByName('@JobID').Value := jid;
sp.Parameters.ParamByName('@DriverID').Value := DriverID;
//[…]
sp.Parameters.ParamByName('@Result').Direction := pdOutput; //returned from stored proc
sp.ExecProc;
Result := sp.Parameters.ParamByName('@Result').Value;
sp.Free;
con.Free;
end; // end OpenHeader(DriverID: Integer, …, ScanStart: DateTime, …): integer
ご協力いただきありがとうございます。