Форум: "Базы";
Текущий архив: 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.056 c