最近在Delphi TADOStoredProc/D6和RAD Studio XE2上出现故障

use*_*866 11 sql-server delphi delphi-6 delphi-xe2

感谢任何能提供一些帮助的人......

背景:

我有一个应用程序编码,仍然支持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
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助,您可以提供.

Dan*_*n S 0

尝试使用 SQL Server Native Client 10.0 OLE DB 提供程序

Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername;
Pwd=myPassword;
Run Code Online (Sandbox Code Playgroud)