ADOConnection, сервисы, проблема с подключением к БД ()

Bobby
Дата: 09.01.2020 17:43:35
Всем доброго дня! Проблема в следующем.
Было обычное приложение, в котором был некий функционал, который создавал поток (потоки), которые в свою очередь внутри себя создавал ADO-шные контролы (ADOConnection, ADOStoredProc и т.д.) и все прекрасно работало. Решил переделать все в сервис.
Внутри сервиса создал класс потока:
  TThreadLoad = Class(TThread)
  private
    connect: TADOConnection;

  //Объявление других ADO-шных контролов   

    prov,user,base,serv,pass,sport,str1,us_id,sqnt,sqnt_update,fname,req,send,
    req_update,req_update_current,constr,log_mess:string;
    qnt,qnt_update:integer;
    ini:tinifile;
    f: textfile;
    procedure WriteLog(strLog:string);
  protected
    procedure Execute; override;
  end;


из ServiceExecute(Sender: TService) создаю поток и запускаю его:
var
  path,fname:string;
begin
  path:=ExtractFilePath(ParamStr(0));
  fname:=path+'log.txt';
  if fileexists(fname) then
    begin
      AssignFile(f, fname);
      Reset(f);
      append (f);
      Writeln (f,datetimetostr(now)+chr(9)+'Запуск загрузки');
       CloseFile(f) ;
    end;
  with TThreadLoad.Create(True) do
  begin
    Resume;
  end;

Далее код попытки подключения к серверу БД в самом потоке:
procedure TThreadLoad.Execute;
var
  path:string;
begin
  inherited;
  try
    FreeOnTerminate := True;
    CoInitialize(nil);
    path:=ExtractFilePath(ParamStr(0));
    if fileExists(path+'connect.ini') then
      begin
        ini:=tinifile.Create(path+'connect.ini');
        prov:=ini.ReadString('SQL Server','Provider',' ');
        us_id:=ini.ReadString('SQL Server','Logid',' ');
        base:=ini.ReadString('SQL Server','Database',' ');
        serv:=ini.ReadString('SQL Server','ServerName',' ');
        pass:=ini.ReadString('SQL Server','LogPassword',' ');
        constr:='Provider='+prov+';User ID='+us_id+';Initial Catalog='+base+';Data Source='+serv+';Password='+pass;

        
        connect:=TADOConnection.Create(nil);
        connect.ConnectionString:=constr;
        try
          connect.Open();  //На этой строке программа молча вылетает
          log_mess:=datetimetostr(now)+chr(9)+'Зацепились к базе...';
          WriteLog(log_mess);
          // Далее основная логика, но до нее ход не доходит
        except
          on e:exception do
          begin
            WriteLog(e.Message);
          end;
        end;
      end;
  finally
    CoUnInitialize;
  end;


на строке connect.Open(); процесс просто прерывается и вылетает, не говоря ни слова. Повторюсь, что в обычном "оконном варианте" все работает норм.
Подскажите, плз, в чем грабли и куда копать? Заранее благодарен!
Zelius
Дата: 09.01.2020 22:17:54
Bobby,

а если запустить сервис от имени пользователя? а по какому протоколу подключение, может Named Pipes какой нить?
Никогда не сталкивался с такой проблемой. у меня сервис к MSSQL подключается.
Dimitry Sibiryakov
Дата: 09.01.2020 22:27:46

Bobby
Внутри сервиса создал класс потока

Первая ошибка. В сервисе это не нужно, а местами и противопоказано. Код сервиса уже
выполняется в специально выделенном потоке и его завершение приводит к остановке сервиса и
смерти всех порождённых потоков.

Posted via ActualForum NNTP Server 1.5

Кроик Семён
Дата: 09.01.2020 23:26:36
может не хватает
CoInitialize
...
...
CoUninitialize
Zelius
Дата: 10.01.2020 00:04:42
Dimitry Sibiryakov

Bobby
Внутри сервиса создал класс потока

Первая ошибка. В сервисе это не нужно, а местами и противопоказано. Код сервиса уже
выполняется в специально выделенном потоке и его завершение приводит к остановке сервиса и
смерти всех порождённых потоков.

Кто как предпочитает, пробовал и так и так, мне больше нравится отдельным потоком
wadman
Дата: 10.01.2020 07:00:28
Bobby
Подскажите, плз, в чем грабли и куда копать?

Попробуй
CoInitializeEx(nil, COINIT_MULTITHREADED);

А перед open закинь в лог constr.
Bobby
Дата: 10.01.2020 09:17:02
wadman
Bobby
Подскажите, плз, в чем грабли и куда копать?

Попробуй
CoInitializeEx(nil, COINIT_MULTITHREADED);

А перед open закинь в лог constr.


поменял на
CoInitializeEx(nil, COINIT_MULTITHREADED);


стало вылетать на
connect:=TADOConnection.Create(nil);
wadman
Дата: 10.01.2020 09:22:33
Bobby
стало вылетать на

Не информативная ошибка.

Доступ к файлу, куда лог пишется, у сервиса есть?
Bobby
Дата: 10.01.2020 09:34:59
wadman
Bobby
стало вылетать на

Не информативная ошибка.

Доступ к файлу, куда лог пишется, у сервиса есть?


Доступ к файлу есть, конечно.
Блок записи в файл ПЕРЕД запуском потока отрабатывает:
var
  path,fname:string;
begin
  path:=ExtractFilePath(ParamStr(0));
  fname:=path+'log.txt';
  if fileexists(fname) then
    begin
      AssignFile(f, fname);
      Reset(f);
      append (f);
      Writeln (f,datetimetostr(now)+chr(9)+'Запуск загрузки');
       CloseFile(f) ;
    end;
  with TThreadLoad.Create(True) do
  begin
    Resume;
  end;

т.е. строка "10.01.2020 9:14:18 Запуск загрузки" в текстовом файле появляется
Bobby
Дата: 10.01.2020 09:40:59
wadman
Bobby
стало вылетать на

Не информативная ошибка.

Доступ к файлу, куда лог пишется, у сервиса есть?


Более того, в потоке вставил вот такую проверку, чтоб уж наверняка:
        CoInitializeEx(nil, COINIT_MULTITHREADED);

          log_mess:=datetimetostr(now)+chr(9)+'Проверка записи из потока...';
          WriteLog(log_mess);
        connect:=TADOConnection.Create(nil);  //На этой строчке выполнение прерывается если  CoInitializeEx(nil, COINIT_MULTITHREADED);

        connect.ConnectionString:=constr;

Строка в текстовом файле появляется, дело точно не в правах, как мне кажется.