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.
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? –
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
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