Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
7-58327
Semyon
2002-04-11 18:04
2002.07.18
winXP


1-58041
Sokoloff
2002-07-04 17:19
2002.07.18
Code completion


1-58097
_dron_
2002-07-08 14:14
2002.07.18
Как проверить создана ли форма или нет


1-58210
drt
2002-07-06 23:15
2002.07.18
random цвета


1-58222
Goblinus
2002-07-07 15:50
2002.07.18
Шрифты





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский