Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Вниз

Как заставить работать ADO в сервисе NT   Найти похожие ветки 

 
Rav   (2008-07-16 08:39) [0]

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

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

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


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

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

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


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


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


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


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

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


 
Ega23 ©   (2008-07-16 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.



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

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

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


 
clickmaker ©   (2008-07-16 10:04) [6]

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

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


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

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


 
sniknik ©   (2008-07-16 10:24) [8]

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


 
Ega23 ©   (2008-07-16 10:34) [9]


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


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


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


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


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


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


> CoInitialize помог

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


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

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

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


 
Johnmen ©   (2008-07-16 15:25) [13]

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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.043 c
2-1232484018
postedman
2009-01-20 23:40
2009.03.15
Компоненты TStringList и TObjectList


15-1231365013
dmk
2009-01-08 00:50
2009.03.15
Vista64 и X58


15-1231588343
Кое кто
2009-01-10 14:52
2009.03.15
С помощью какой программы...


15-1231745269
vajo
2009-01-12 10:27
2009.03.15
Vista HP. Как попасть в папку Local Settings?


15-1231989207
Slider007
2009-01-15 06:13
2009.03.15
С днем рождения ! 15 января 2009 четверг





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский