12

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

背景:

我有一个应用程序在 Borland Delphi v6 中编码并且仍然受支持。最近,我遇到了 TADStoredProc 类无法执行存储过程的问题。这段代码之前已经稳定了好几年,从未被修改过。

我可以在请求上配置超时,这是受尊重的,但是存储过程调用永远不会运行,即使超时时间很长。应用程序只是挂起,或因超时异常而退出。(我知道服务器没有负担过重,并响应同一客户端发起的其他 SQL SELECT 请求。)

我知道D6很旧。我确实有一个使用 Embarcadero RAD Studio XE2 的单独环境,在那里我设法构建了相同的项目,但仍然存在相同的问题。... 只想确认一下。

去哪儿?

  • 请查看提供的代码,看看是否有更好的方法来做事。(也许 MSSQL 界面更挑剔,最近更新后?)我当然欢迎推荐。
  • 是否有另一种方法可以插入应用程序,可靠且不需要 TADStoredProc?我已经完成了挖掘,但没有找到任何好的例子。

代码示例

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

0

尝试使用 SQL Server Native Client 10.0 OLE DB Provider

Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername;
Pwd=myPassword;
于 2013-06-21T12:38:56.800 回答
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/64 位版本的驱动程序,因为要与 32 位 sql server 通信,您需要 32 位驱动程序,反之亦然。

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

Microsoft® SQL Server® 2016 Feature 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® SQL Server® 2012 Native 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
您将找到 sqlncli.msi 的 x86/x64 版本

Microsoft® SQL Server® 2008 R2 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 生命周期,OLEDB 被宣布弃用以切换到最新的 ODBC 驱动程序,但去年 10 月它被重新声明为 undeprecated

于 2017-12-13T10:52:30.867 回答