提问人:user1631866 提问时间:8/29/2012 最后编辑:TLamauser1631866 更新时间:12/13/2017 访问量:2266
Delphi TADOStoredProc / D6 和 RAD Studio XE2 上最近的故障
Recent Failures on Delphi TADOStoredProc / D6 and RAD Studio 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
感谢您提供的任何帮助。
答:
尝试使用 SQL Server Native Client 10.0 OLE DB 访问接口
Provider=SQLNCLI10;Server=myServerAddress;Database=myDataBase;Uid=myUsername;
Pwd=myPassword;
您可以尝试在之后简单地删除它,因为它只是为了指定要使用的版本号。.1
SQLOLEDB
con.ConnectionString := 'Provider=SQLOLEDB;Password=<testPwd>;Persist Security Info=True;User ID=<testUser>;Initial Catalog=<myDB>;Data Source=<myServer>';
您应该考虑切换到较新的驱动程序。SQLNCLI
您尚未指定 Windows Server 版本、SQL Server 版本或客户端 Windows 版本,但: 也应该存在于较新的系统中,
以实现向后兼容性;
应随 SQL Server 2005 一起提供;
应随 SQL Server 2008 一起提供;
应随 SQL Server 2012 和 2014 一起提供;
应随 SQL Server 2016 一起提供;SQLOLEDB
SQLNCLI
SQLNCLI10
SQLNCLI11
SQLNCLI13
请注意 32/64 位版本的驱动程序,因为要与 32 位 sql server 通信,您需要 32 位驱动程序,反之亦然。
请确保在客户端上安装正确的驱动程序。
Microsoft SQL Server 2016 功能包
Windows 8、8.1、10、Windows Server® 2012、2012 R2、2016 https://www.microsoft.com/en-us/download/details.aspx?id=52676 您将找到 sqlncli 的 x86/x64 版本.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 的 x86/x64 版本.msi®
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 月它被重新宣布为未弃用。
评论