![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как заставить работать 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".
даже по-русски и то не помогает.