Форум: "Базы";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизВызов хранимых процедур MSSQL из сервиса (Delphi 5). Найти похожие ветки
← →
KAA (2002-06-24 15:22) [0]Необходимо осуществить вызов хранимой процедуры при помощи TADOStoredProc. Программа выдает ошибку "Не был произведен вызов CoInitialize".
Разъяснте чайнику, что это такое и как с этим бороться?
← →
zx (2002-06-24 15:28) [1]Ты sp ставил?
http://info.borland.com/devsupport/delphi/mdac26.html
← →
KAA (2002-06-24 15:45) [2]Это ADOExpress Update Pack 2 ?
Нет. А что это такое и чем черевата установка?
← →
Lord Warlock (2002-06-24 15:51) [3]Как ни странно, была та же ошибка, см.
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1024732119&n=2
← →
Anatoly Podgoretsky (2002-06-24 16:12) [4]Так произведи, это обязательно, иначе работать не будет
← →
KAA (2002-06-24 17:16) [5]Поставил я этот ADOExpress Update Pack 2, а перед этим Delphi 5 Enterprise Update Pack и Delphi 5 ADOExpress Update.
В результате ADO компоненты просто исчезли.
Что делать то теперь?
← →
vuk (2002-06-24 18:24) [6]Программа же ясно написала что нужно было делать - вызвать CoInitialize.
← →
KAA (2002-06-24 18:30) [7]Так там наверняка есть нюансы. Я попробовал вызвать, но никакого эффекта.
← →
vuk (2002-06-24 18:32) [8]>Я попробовал вызвать, но никакого эффекта.
В каком месте?
← →
KAA (2002-06-24 18:34) [9]В самом начале, до начала цикла подпроцесса, до того как происходит первое обращение к хранимой процедуре.
← →
vuk (2002-06-24 18:45) [10]CoInitialize необходимо вызывать в том же потоке(лучше, конечно, при старте потока), в котором будут выполняться обращения к COM (в данном случае - к ADO) до самого первого обращения (до установки соединения с БД в Вашем случае).
← →
KAA (2002-06-24 18:54) [11]Я вызвал до потока. :(
Если теперь востановить бы АДО компоненты, можно попробовать внутри проинициализировать.
← →
Delirium (2002-06-24 18:59) [12]"...Не был произведен вызов CoInitialize...Разъяснте чайнику, что это такое и как с этим бороться?" - вызываем справку Delphi о Windows SDK, читаем ... Оказывается - "Функция CoInitialize инициализирует библиотеку Компонентно-Объектной Модели(COM). Вы должны проинициализировать библиотеку прежде, чем cможете вызывать такие функции. Приложения должны вызывать CoInitialize прежде, чем будут сделаны любые другие вызовы библиотеки COM с двумя исключениями: функция CoGetMalloc, и вызовы методов распределения памяти...Естественно, CoInitialize вызывается только один раз в процессе, который использует библиотеку OLE. Допустимы многочисленные вызовы, но результатом будет S_FALSE. Для того, чтобы правильно заканчивать работу с библиотекой, каждый успешный вызов CoInitialize, включая те которые вернули S_FALSE, должен уравновешиваться соответствующим вызовом функции CoUninitialize."/Перевожу с листа, так что несколько кривовато :)/ От себя добавлю - стоит почитать MSDN про CoInitializeEx.
← →
vuk (2002-06-24 19:15) [13]>Естественно, CoInitialize вызывается только один раз в процессе,
>который использует библиотеку OLE.
Не правильно. CoInitialize должна вызываться для каждого потока, в котором необходимо использовать COM.
Вот и MSDN о том же:
...
CoInitializeEx must be called at least once, and is usually called only once, for each thread that uses the COM library.
← →
KAA (2002-06-24 20:03) [14]У меня есть сервис, на нем компоненты TADOStoredProc (поместил их визуально, а не создаю при помощи create). Вопрос, в какой момент надо вызывать CoInitialize ?
← →
vuk (2002-06-24 20:17) [15]К примеру в OnStart.
...
CoInitialize(nil);
Connection.Connected := true;
...
← →
Shaman_Naydak (2002-06-24 20:21) [16]И не забыть в конце вызвать CoUnInitialize
← →
vuk (2002-06-24 20:23) [17]Хотя... лучше будет сделать иначе.
В OnExecute
CoInitialize(nil);
try
//здесь работа сервиса
finally
CoUninitialize;
end;
Хотя, если честно, я делаю немного иначе. Обычно весь полезный код службы выношу в отдельный поток а из TService запускается такой поток.
← →
Shaman_Naydak (2002-06-24 20:23) [18]Уточню.. на OnStart /OnStop - CoInitialize(nil) / CoUnInitialize;
В OnCreate /OnDestroy делать смысла нет, они выполняются в основном потоке
← →
Delirium (2002-06-25 10:52) [19]> vuk © (24.06.02 19:15)
">...Естественно, CoInitialize вызывается только один раз в процессе, который использует библиотеку OLE...
Не правильно. CoInitialize должна вызываться для каждого потока"
- это я понимаю, просто Help перевел дословно, а там " CoInitialize is called only once in the process" - очевидно, под словом process подразумерается именно поток(нить), а не приложение.
← →
KAA (2002-06-25 15:19) [20]Я перед вызовом хранимой процедуры делаю CoInitialize(nil), после отработки CoUninitialize(). Не знаю, правильно ли это, но все вроде работает.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c