感谢任何可以提供帮助的人......
背景
我有一个应用程序编码,仍然支持Borland Delphi v6。最近,我遇到了TADOStoredProc类无法执行存储过程的问题。此代码以前已稳定了好几年,从未被修改过。
我可以在请求上配置超时,但是存储过程调用永远不会运行,即使在非常长的超时时也是如此。应用程序只是挂起,或者在超时异常时保释。 (我知道服务器不会负担过重,并且会响应同一客户端发出的其他SQL SELECT请求。)
我知道D6已经老了。我与Embarcadero RAD Studio XE2有一个单独的环境,在那里我设法构建了同一个项目,并且仍然存在相同的问题。 ......只是为了确保。
去哪儿?
代码示例
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
感谢您提供的任何帮助。
答案 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。