2012-08-29 201 views
11

由於任何能提供一些幫助...最近的失敗德爾福TADOStoredProc/D6和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 

感謝您的幫助,您可以提供。

+0

你有什麼錯誤嗎?你有沒有試過Profiler來知道程序是否被執行?你有沒有試過從ssms執行程序? –

+0

謝謝你的建議。奇怪的是,SQL Profiler似乎在這次「工作」的時候動搖了。引發的Delphi ADO運行時異常是「超時」。從SSMS運行沒有問題。 – user1631866

+0

謝謝你的建議。 |奇怪的是,SQL Profiler似乎在這次「工作」的時候動搖了。拋出的Delphi ADO運行時異常是很長的「超時」。從SSMS運行沒有問題。 |奇怪的是,通過TADOQuery運行的動態SQL在所有實例中都可以,除非我爲存儲過程調用運行「EXEC ...」。 |服務器上有什麼「關閉」的東西? – user1631866

回答

0

嘗試使用SQL Server本機客戶端10.0 OLE DB提供程序

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

您可以嘗試簡單地刪除.1SQLOLEDB後,因爲它是唯一指定要使用的版本號。

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®上2016功能包
的Windows 8,8.1,10,Windows Server 2012中,2012 R2年,2016年
https://www.microsoft.com/en-us/download/details.aspx?id=52676
你會發現sqlncli.msi

的於x86/x64的版本

Microsoft®SQLServer®上2012本機客戶端
的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®SQLServer®2008的R2本機客戶端
的Windows Vista,XP,Windows 7,Windows Server 2003中,2008年,2008 R2
X86包:http://go.microsoft.com/fwlink/?LinkID=188400&clcid=0x409
64套餐:http://go.microsoft.com/fwlink/?LinkID=188401&clcid=0x409

收費也注意OLEDB/ODBC lifecycle,OLEDB被宣佈棄用切換到最新的ODBC驅動程序,但去年十月它被重新聲明undeprecated