powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADOConnection, сервисы, проблема с подключением к БД ()
12 сообщений из 12, страница 1 из 1
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912153
Bobby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня! Проблема в следующем.
Было обычное приложение, в котором был некий функционал, который создавал поток (потоки), которые в свою очередь внутри себя создавал ADO-шные контролы (ADOConnection, ADOStoredProc и т.д.) и все прекрасно работало. Решил переделать все в сервис.
Внутри сервиса создал класс потока:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  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) создаю поток и запускаю его:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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;


Далее код попытки подключения к серверу БД в самом потоке:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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(); процесс просто прерывается и вылетает, не говоря ни слова. Повторюсь, что в обычном "оконном варианте" все работает норм.
Подскажите, плз, в чем грабли и куда копать? Заранее благодарен!
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912232
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby,

а если запустить сервис от имени пользователя? а по какому протоколу подключение, может Named Pipes какой нить?
Никогда не сталкивался с такой проблемой. у меня сервис к MSSQL подключается.
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912235
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BobbyВнутри сервиса создал класс потока

Первая ошибка. В сервисе это не нужно, а местами и противопоказано. Код сервиса уже
выполняется в специально выделенном потоке и его завершение приводит к остановке сервиса и
смерти всех порождённых потоков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912242
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может не хватает
Код: pascal
1.
2.
3.
4.
CoInitialize
...
...
CoUninitialize
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912245
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

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

Кто как предпочитает, пробовал и так и так, мне больше нравится отдельным потоком
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912268
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby
Подскажите, плз, в чем грабли и куда копать?

Попробуй
Код: pascal
1.
CoInitializeEx(nil, COINIT_MULTITHREADED);


А перед open закинь в лог constr .
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912288
Bobby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Bobby
Подскажите, плз, в чем грабли и куда копать?

Попробуй
Код: pascal
1.
CoInitializeEx(nil, COINIT_MULTITHREADED);


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


поменял на
Код: pascal
1.
CoInitializeEx(nil, COINIT_MULTITHREADED);



стало вылетать на
Код: pascal
1.
connect:=TADOConnection.Create(nil);
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912290
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby
стало вылетать на

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

Доступ к файлу, куда лог пишется, у сервиса есть?
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912298
Bobby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Bobby
стало вылетать на

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

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


Доступ к файлу есть, конечно.
Блок записи в файл ПЕРЕД запуском потока отрабатывает:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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 Запуск загрузки" в текстовом файле появляется
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912304
Bobby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Bobby
стало вылетать на

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

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


Более того, в потоке вставил вот такую проверку, чтоб уж наверняка:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
        CoInitializeEx(nil, COINIT_MULTITHREADED);

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

        connect.ConnectionString:=constr;


Строка в текстовом файле появляется, дело точно не в правах, как мне кажется.
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912315
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
BobbyВнутри сервиса создал класс потока

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

When the OnExecute event handler finishes, the service thread terminates.
Возможно твой сервис "умирает" раньше, чем поток что-то успевает сделать.

См. в сторону OnStart и не бросай ссылку на поток, чтобы в OnStop она была доступна.
...
Рейтинг: 0 / 0
ADOConnection, сервисы, проблема с подключением к БД ()
    #39912468
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bobby,

стоит посмотреть в событиях Windows, возможно там найдутся записи о прибитии сервиса с сообщением об ошибке

Код: powershell
1.
eventvwr.exe


или

Код: powershell
1.
%windir%\system32\eventvwr.msc /s
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADOConnection, сервисы, проблема с подключением к БД ()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]