Спасибо, кто может оказать некоторую помощь...
Фон:
У меня есть приложение, закодированное и поддерживаемое в 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
Спасибо за любую помощь, которую вы можете предоставить.