12

いくつかの支援を提供できる人に感謝します...

バックグラウンド:

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

ご協力いただきありがとうございます。

4

2 に答える 2