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

时间:2012-08-29 02:45:29

标签: sql-server delphi delphi-xe2 delphi-6

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

背景

我有一个应用程序编码,仍然支持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

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

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

Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername;
Pwd=myPassword;

答案 1 :(得分:0)

您可以尝试在.1之后删除SQLOLEDB,因为它只是指定要使用的版本号。

con.ConnectionString :=  'Provider=SQLOLEDB;Password=<testPwd>;Persist Security Info=True;User ID=<testUser>;Initial Catalog=<myDB>;Data Source=<myServer>';

您应该考虑切换到较新的SQLNCLI驱动程序。

您尚未指定Windows服务器版本,也未指定sql server版本,也未指定客户端Windows版本,但是:
为了向后兼容,SQLOLEDB也应出现在较新的系统中;
SQLNCLI应附带SQL Server 2005;
SQLNCLI10应附带SQL Server 2008;
SQLNCLI11应附带SQL Server 2012和2014;
SQLNCLI13应该随SQL Server 2016一起提供;

注意 32 / 64bit 版本的驱动程序,因为要与32位sql server通信,你需要32位驱动程序,反之亦然。

确保在您的客户端上安装了正确的驱动程序。

Microsoft®SQLServer®2016Feature Pack
Windows 8,8.1,10,Windows Server 2012,2012 R2,2016
https://www.microsoft.com/en-us/download/details.aspx?id=52676
您将找到x86 / x64版本的sqlncli.msi

Microsoft®SQLServer®2012Native Client
Windows 7,8,8.1,10,Windows Server 2008 R2,2012,2012 R2
https://www.microsoft.com/en-us/download/details.aspx?id=50402
您将找到x86 / x64版本的sqlncli.msi

Microsoft®SQLServer®2008R2 Native Client
Windows Vista,XP,7,Windows Server 2003,2008,2008 R2
x86包:http://go.microsoft.com/fwlink/?LinkID=188400&clcid=0x409
x64包:http://go.microsoft.com/fwlink/?LinkID=188401&clcid=0x409

还要注意OLEDB/ODBC lifecycle ,声明OLEDB已被弃用以切换到最新的ODBC驱动程序,但去年10月重新声明了undeprecated