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