Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADOConnection, сервисы, проблема с подключением к БД () / 12 сообщений из 12, страница 1 из 1
09.01.2020, 17:43
    #39912153
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOConnection, сервисы, проблема с подключением к БД ()
Всем доброго дня! Проблема в следующем.
Было обычное приложение, в котором был некий функционал, который создавал поток (потоки), которые в свою очередь внутри себя создавал 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
09.01.2020, 22:17
    #39912232
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOConnection, сервисы, проблема с подключением к БД ()
Bobby,

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

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

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

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

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

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


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

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


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


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



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

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

Доступ к файлу, куда лог пишется, у сервиса есть?
...
Рейтинг: 0 / 0
10.01.2020, 09:34
    #39912298
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOConnection, сервисы, проблема с подключением к БД ()
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
10.01.2020, 09:40
    #39912304
Bobby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOConnection, сервисы, проблема с подключением к БД ()
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
10.01.2020, 10:09
    #39912315
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADOConnection, сервисы, проблема с подключением к БД ()
Dimitry Sibiryakov
BobbyВнутри сервиса создал класс потока

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

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

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

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

Код: powershell
1.
eventvwr.exe


или

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


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