Недавние сбои в Delphi 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

Спасибо за любую помощь, которую вы можете предоставить.

Ответ 1

Попробуйте использовать собственный клиент SQL Server Native Client 10.0

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

Ответ 2

Вы можете просто удалить этот .1 после SQLOLEDB, потому что он должен указывать только номер версии для использования.

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

Вам следует рассмотреть возможность переключения на более новый драйвер SQLNCLI.

Вы не указали версию сервера Windows, версию сервера SQL Server или версию клиентского окна, но: SQLOLEDB должен присутствовать также в новых системах для обратной совместимости;
SQLNCLI должен поставляться с SQL Server 2005; SQLNCLI10 должен поставляться с SQL Server 2008; SQLNCLI11 должен поставляться с SQL Server 2012 и 2014; SQLNCLI13 должен поставляться с SQL Server 2016;

Обратите внимание на версию драйверов 32/64bit, потому что для работы с 32-битным SQL-сервером вам нужен 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
Вы найдете как x86/x64 версии sqlncli.msi

Родной клиент Microsoft® SQL Server® 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
Вы найдете как x86/x64 версии sqlncli.msi

Собственный клиент Microsoft® SQL Server® 2008 R2
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, но в прошлом октябре он был обновлен undeprecated.