2012-08-29 26 views
11

Nhờ bất kỳ mà có thể cung cấp một số hỗ trợ ...Thất bại gần đây trên Delphi TADOStoredProc/D6 và RAD Studio XE2

Bối cảnh:

Tôi có một ứng dụng mã hóa và vẫn được hỗ trợ trong Borland Delphi v6. Gần đây tôi đã có vấn đề với lớp TADOStoredProc không thực hiện thủ tục được lưu trữ. Mã này trước đây đã được ổn định trong nhiều năm và chưa bao giờ được sửa đổi.

Tôi có thể định cấu hình thời gian chờ trên yêu cầu, được tôn trọng, tuy nhiên cuộc gọi thủ tục được lưu trữ không bao giờ chạy, ngay cả khi hết thời gian chờ. Ứng dụng này chỉ bị treo hoặc bails trên một ngoại lệ timeout. (Tôi biết máy chủ không bị quá tải và phản hồi các yêu cầu SQL SELECT khác có cùng một máy khách.)

Tôi biết D6 cũ. Tôi có một môi trường riêng biệt với Embarcadero RAD Studio XE2, nơi tôi quản lý để xây dựng cùng một dự án, và vẫn còn những vấn đề tương tự. ... Chỉ để chắc chắn.

Đi đâu?

  • Vui lòng xem lại mã được cung cấp và xem có cách nào tốt hơn để làm việc không. (Có lẽ giao diện MSSQL là cầu kỳ hơn, sau khi cập nhật gần đây?) Tôi chắc chắn hoan nghênh các khuyến nghị.
  • Có phương pháp thay thế nào tôi có thể cắm vào ứng dụng, điều đó đáng tin cậy và không yêu cầu TADOStoredProc không? Tôi đã thực hiện công việc đào bới, nhưng chưa đạt được bất kỳ ví dụ hay nào.

Mã số Ví dụ

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 

Nhờ sự giúp đỡ bạn có thể cung cấp.

+0

Bạn có gặp bất kỳ lỗi nào không? Bạn đã thử Profiler để biết nếu thủ tục đã được thực hiện? Và bạn đã thử thực hiện thủ tục từ ssms chưa? –

+0

Cảm ơn đề xuất. Kỳ lạ thay, SQL Profiler dường như lắc đủ xung quanh nó "làm việc" lần này. Các trường hợp ngoại lệ thời gian chạy Delphi ADO được ném là "Timeouts". Chạy từ SSMS không có vấn đề gì. – user1631866

+0

Cảm ơn đề xuất. | Kỳ lạ thay, SQL Profiler dường như lắc đủ xung quanh nó "làm việc" lần này. Các trường hợp ngoại lệ thời gian chạy Delphi ADO được ném là "Thời gian chờ" có độ dài lớn. Chạy từ SSMS không có vấn đề gì. | Ngẫu nhiên thông qua việc chạy SQL động thông qua TADOQuery là OK trong mọi trường hợp, trừ khi tôi chạy một "EXEC ..." cho một cuộc gọi thủ tục được lưu trữ. | Là một cái gì đó "tắt" trên máy chủ? – user1631866

Trả lời

0

Cố gắng sử dụng SQL Server Native Client 10,0 OLE DB Provider

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

Bạn có thể cố gắng đơn giản là loại bỏ rằng .1 sau SQLOLEDB bởi vì nó chỉ là để xác định số phiên bản để sử dụng.

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

Bạn nên cân nhắc chuyển sang trình điều khiển SQLNCLI mới hơn.

Bạn chưa chỉ định phiên bản máy chủ cửa sổ cũng như phiên bản máy chủ sql hoặc phiên bản cửa sổ ứng dụng khách nhưng:
SQLOLEDB cũng phải có mặt trong các hệ thống mới hơn để tương thích ngược;
SQLNCLI nên đi kèm với SQL Server 2005;
SQLNCLI10 nên đi kèm với SQL Server 2008;
SQLNCLI11 nên đi kèm với SQL Server 2012 và 2014;
SQLNCLI13 nên đi kèm với SQL Server 2016;

Chú ý đến 32/64bit phiên bản trình điều khiển vì để nói chuyện với máy chủ 32 bit sql, bạn cần trình điều khiển 32 bit và ngược lại.

Đảm bảo cài đặt đúng trình điều khiển trên máy khách của bạn.

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
Bạn sẽ tìm thấy cả hai phiên bản x86/x64 của 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
Bạn sẽ tìm thấy cả hai phiên bản x86/x64 của sqlncli.msi

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

Pay cũng chú ý đến OLEDB/ODBC lifecycle, OLEDB được tuyên bố phản đối để chuyển sang trình điều khiển ODBC mới nhất, nhưng tháng Mười năm ngoái nó đã redeclared undeprecated.

Các vấn đề liên quan