Конференция "Базы" » Как заставить работать ADO в сервисе NT [D7, MSSQL]
 
  • Rav (16.07.08 08:39) [0]
    Доброго времени суток, уважаемые мастера!

    Есть у меня небольшой прикладной сервер, обслуживает програмки-клиенты по Tcp протоколу. Фактически он служит буфером между базой данных и клиентами. Связь с базой данных осуществляется через ADO. Пока сервер был выполнен в виде обычного оконного приложения, все работало нормально.
    Решил я переделать сервер в виде сервиса, дабы запускался сервер автоматом без входа пользователя в систему. Да и ресурсы на окна тратить нет необходимости. Но в сервисе ADO отказывается работать категорически: "Не произведен вызов CoInitialize". Покопавшись в исходниках, нашел, что выхов этот идет в ComObj в процедуре инициализации модуля. Но процедура эта закрытая и напрямую оттуда вызвать я ее не могу.
    Возникает вопрос: как правильно проинициализировать COM?
    И может быть в сервисе вообще имеет смысл отказаться от ADO? Но BDE я вообще не хочу использовать по некоторым соображениям, а dbExpress тоже вроде бы использует ole. И что лучше по скорости работы с БД? БД - MS SQL2000

    Заранее спасибо!
  • Поросенок Винни-Пух © (16.07.08 08:59) [1]
    "Не произведен вызов CoInitialize".

    даже по-русски и то не помогает.
  • Rav (16.07.08 09:42) [2]

    > даже по-русски и то не помогает.


    что значит "по русски не помогает"?
    Эта фенкция вызывается из ole32.dll. И не так все там просто
    Сначала делается попытка вызвать CoInintializeEx с параметрами (параметры тоже надо знать), при завершении надо вызвать CoUninitialize/
    И Я НЕ УВЕРЕН, ЭТОГО БУДЕТ ДОСТАТОЧНО. Хотелось бы использовать проверенную процедуру.
  • Rav (16.07.08 09:51) [3]
    Сорри за беспокойство.
    Решение проблемы уже нашел на другом форуме
  • Ega23 © (16.07.08 09:51) [4]
    Тест FastCGI с использованием коннекта к MSSQL

    program testado;

    {$APPTYPE CONSOLE}
    {$E fci}

    uses
     SysUtils,
     ADODB,
     ActiveX,
     fcgiapp;

    var
     conMain : TADOConnection;
     ads : TADODataSet;
     _in, _out, _err : PFCGX_Stream;
     envp    : FCGX_ParamArrayType;
     tmpQS, tmpRM  : PChar;
     counter : Integer;

    begin
     CoInitialize(nil);
     conMain := TADOConnection.Create(nil);
     ads := TADODataSet.Create(nil);

     conMain.ConnectionString := 'Provider=SQLOLEDB.1;Password=***;Persist Security Info=True;User ID=***;Initial Catalog=****;Data Source=***';
     conMain.LoginPrompt := False;
     conMain.Connected := True;
     ads.Connection := conMain;

     counter := 1;
     while(FCGX_Accept(_in, _out, _err, envp) >= 0)  do
     begin
       tmpQS := FCGX_GetParam('QUERY_STRING', envp);
       tmpRM := FCGX_GetParam('REQUEST_METHOD', envp);

       FCGX_PutS('Content-type: text/html;'+#10#10#10#10, _out^);

       FCGX_PutS('<HTML><HEAD><TITLE>MSSQL Data Test</TITLE></HEAD><BODY>', _out^);

       if tmpQS<>nil then
       begin
         FCGX_PutS('QUERY_STRING: <BR>', _out^);
         FCGX_PutS(tmpQS, _out^);
         FCGX_PutS('<BR>', _out^);
       end;

       if tmpRM<>nil then
       begin
         FCGX_PutS('REQUEST_METHOD: <BR>', _out^);
         FCGX_PutS(tmpRM, _out^);
         FCGX_PutS('<BR>', _out^);
       end;

       ads.CommandText := 'Select BAName from BusinessActions';
       ads.Open;

       FCGX_PutS('<TABLE BORDER=1>', _out^);

       while not ads.EOF do
       begin
         FCGX_PutS(PAnsiChar('<TR><TD WIDTH=400>' + ads.FieldByName('BAName').AsString + '</TD></TR>'), _out^);
         ads.Next;
       end;
       FCGX_PutS('</TABLE><BR><BR>', _out^);

       ads.Close;
       
       FCGX_PutS(PAnsiChar('<H5> Вызовов - ' + IntToStr(counter) + ' </H5><BR><BR>'), _out^);
       Inc(counter);

       FCGX_PutS('</BODY></HTML>', _out^);
     end; //while

     CoUninitialize;
    end.


  • Поросенок Винни-Пух © (16.07.08 10:01) [5]
    что значит "по русски не помогает"?

    Это значит тебе по-русски написали : ошибка в том, что не был произведен вызов CoInitialize, а ты спрашиваешь, что не так и что надо сделать.
  • clickmaker © (16.07.08 10:04) [6]
    > Решение проблемы уже нашел на другом форуме

    интересно, какое? неужели более проверенное, чем CoInitialize?
  • sniknik © (16.07.08 10:20) [7]
    > неужели более проверенное, чем CoInitialize?
    не, врядли. просто в него вселили УВЕРЕННОСТЬ. ;о)
  • sniknik © (16.07.08 10:24) [8]
    > Тест FastCGI с использованием коннекта к MSSQL
    не с той оперы... у него указано что работа в сервисе, рабочее тело сервиса это другой поток (не все понимают), т.е. не то же самое, что консоль, а CoInitialize должен быть на каждый поток.
  • Ega23 © (16.07.08 10:34) [9]

    > не с той оперы... у него указано что работа в сервисе, рабочее
    > тело сервиса это другой поток (не все понимают), т.е. не
    > то же самое, что консоль, а CoInitialize должен быть на
    > каждый поток.


    Я тупо пример дал. Ну типа, что ничего невозможного нет...  :)
  • Rav (16.07.08 15:08) [10]

    > неужели более проверенное, чем CoInitialize?


    CoInitialize помог, иначе бы не писал. А вот CoInitializeEx решил проблему. Видимо дело как раз в том, что сервис предполагает несколько потоков.
  • Rav (16.07.08 15:09) [11]

    > CoInitialize помог

    CoInitialize НЕ помог....
  • Поросенок Винни-Пух © (16.07.08 15:19) [12]
    CoInitialize НЕ помог....

    Ой бедаааа....
    Всем помогает а тут нет
  • Johnmen © (16.07.08 15:25) [13]
    при старте потока, в потоке
    CoInitializeEx(NIL, COINIT_MULTITHREADED);


    при завершении потока, в потоке
    CoUnInitialize;

 
Конференция "Базы" » Как заставить работать ADO в сервисе NT [D7, MSSQL]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]