Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

Вызов хранимых процедур 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
14-58271
Igor_
2002-06-19 18:06
2002.07.18
QReport и принтер


3-57941
jen_bond
2002-06-25 01:24
2002.07.18
Autoincrement


1-58168
^Sanya
2002-07-05 18:51
2002.07.18
Открытие файлов (не EXE) из своего приложения


3-58027
Wistner
2002-06-28 02:21
2002.07.18
Как содержимое StringGrid’а вставить в MS Word???


7-58337
nick_vstu
2002-04-25 13:40
2002.07.18
Keyboard