Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как заставить работать ADO в сервисе NT [D7, MSSQL]


Rav ©   (2008-07-16 08:39:00) 

Доброго времени суток, уважаемые мастера!

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

Заранее спасибо!


Johnmen   (2008-07-16 15:25:00) [1]

при старте потока, в потоке
CoInitializeEx(NIL, COINIT_MULTITHREADED);

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


Поросенок Винни-Пух   (2008-07-16 15:19:00) [2]

CoInitialize НЕ помог....

Ой бедаааа....
Всем помогает а тут нет


Rav   (2008-07-16 15:09:00) [3]


> CoInitialize помог

CoInitialize НЕ помог....


Rav   (2008-07-16 15:08:00) [4]


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


CoInitialize помог, иначе бы не писал. А вот CoInitializeEx решил проблему. Видимо дело как раз в том, что сервис предполагает несколько потоков.


Ega23   (2008-07-16 10:34:00) [5]


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


Я тупо пример дал. Ну типа, что ничего невозможного нет...  :)


sniknik   (2008-07-16 10:24:00) [6]

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


sniknik   (2008-07-16 10:20:00) [7]

> неужели более проверенное, чем CoInitialize?
не, врядли. просто в него вселили УВЕРЕННОСТЬ. ;о)


clickmaker   (2008-07-16 10:04:00) [8]

> Решение проблемы уже нашел на другом форуме

интересно, какое? неужели более проверенное, чем CoInitialize?


Поросенок Винни-Пух   (2008-07-16 10:01:00) [9]

что значит "по русски не помогает"?

Это значит тебе по-русски написали : ошибка в том, что не был произведен вызов CoInitialize, а ты спрашиваешь, что не так и что надо сделать.


Rav   (2008-07-16 09:51:00) [10]

Сорри за беспокойство.
Решение проблемы уже нашел на другом форуме


Ega23   (2008-07-16 09:51:00) [11]

Тест 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.


Rav   (2008-07-16 09:42:00) [12]


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


что значит "по русски не помогает"?
Эта фенкция вызывается из ole32.dll. И не так все там просто
Сначала делается попытка вызвать CoInintializeEx с параметрами (параметры тоже надо знать), при завершении надо вызвать CoUninitialize/
И Я НЕ УВЕРЕН, ЭТОГО БУДЕТ ДОСТАТОЧНО. Хотелось бы использовать проверенную процедуру.


Поросенок Винни-Пух   (2008-07-16 08:59:00) [13]

"Не произведен вызов CoInitialize".

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо