Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Вниз

ADO Access   Найти похожие ветки 

 
Tonich ©   (2007-11-16 11:01) [0]

такой вопрос. Поднимаю сервис, в котором соединяюсь с базой данных Ассеss и даже вызываю   CoInitialize; и все равно вылетает ошибка мол не инициализировано, как быть?

вот код

 AnsiString DataSource = ";Data Source="+PATH;
 CoInitialize;
 AccessConnect->ConnectionString = AccessProvider+DataSource;
 AccessConnect->Connected = true;


 
sniknik ©   (2007-11-16 11:08) [1]

> и все равно вылетает ошибка мол не инициализировано
в инициализации нуждается не только модель COM (CoInitialize)... перечитай ошибку внимательнее.

> вот код
данный кусок правильный, нехватает кое чего правда, но оно в другом месте наверняка делается (это ирония если непонятно).


 
Tonich ©   (2007-11-16 11:21) [2]

Coinitialize has not been called- вот ошибка...
что там еще ж надо инициализировать (


 
stanislav_   (2007-11-16 11:21) [3]

AccessConnect - создаешь динамически или где-то на форме лежит?


 
Tonich ©   (2007-11-16 11:23) [4]

на форме лежит..
в сервисе происходит коннект


 
Tonich ©   (2007-11-16 11:23) [5]

создать динамически?


 
Reindeer Moss Eater ©   (2007-11-16 11:27) [6]

не в том потоке вызываешь инициализацию


 
stanislav_   (2007-11-16 11:31) [7]

А ты его закрываешь перед компиляцией?
Скорее всего он у тебя пытается создаться еще до вызова CoInitialize  и ругается.


 
stanislav_   (2007-11-16 11:32) [8]

Tonich ©   (16.11.07 11:23) [5]
Да.


 
sniknik ©   (2007-11-16 11:35) [9]

> не в том потоке вызываешь инициализацию
или, скорее, создание обьектов COM делается до вызова CoInitialize. (те самые недоказанные куски, которые делаются наверняка и обязательно правильно, поэтому и не показаны...)


 
sniknik ©   (2007-11-16 11:36) [10]

:о)
блин, ну мазила и проверяет орфографию...
недоказанные = не показанные


 
Tonich ©   (2007-11-16 11:45) [11]

 AnsiString DataSource = ";Data Source="+PATH;
//  CoInitialize;
 OleInitialize;

 if (AccessConnect == NULL) AccessConnect = new TADOConnection(NULL);
 if (AccessConnect == NULL) throw Exception("Error create ADO");

 AccessConnect->LoginPrompt = false;
 AccessConnect->Mode = cmShareDenyNone;
 AccessConnect->ConnectionString = AccessProvider+DataSource;

 AccessConnect->Connected = true;


таже ситуация....

этот код выполняется в момент старта сервиса...то есть в методе OnStart


 
sniknik ©   (2007-11-16 11:48) [12]

> в момент старта сервиса...то есть в методе OnStart
а Execute это другой поток. т.е. см. [6]


 
sniknik ©   (2007-11-16 11:49) [13]

кстати
OleInitialize это разве одно и тоже с CoInitialize ?


 
Reindeer Moss Eater ©   (2007-11-16 11:55) [14]

Кусочек лога

16.11.2007 11:31:24 ServiceCreate GetCurrentThreadID = 3380
16.11.2007 11:31:24 ServiceStart GetCurrentThreadID = 2224
16.11.2007 11:31:24 ServiceExecute GetCurrentThreadID = 2224


 
sniknik ©   (2007-11-16 11:59) [15]

хм... ну тогда, значит еще чтото есть непоказанное. (либо наоборот один в один как показано, и CoInitialize закоментирован)


 
Reindeer Moss Eater ©   (2007-11-16 12:03) [16]

Скорее всего брошенный в дизайне на сервис конеккшен создается в главном потоке и ему уже нужен coinitialize.
надо проверять.


 
Tonich ©   (2007-11-16 12:29) [17]

блин уже даже перенес в Execute (хотя суда по [14] можно было и не делать)
и все равно не хочет.. (

void __fastcall THotelStore::ServiceExecute(TService *Sender)
{
try
 {
  ConnectAccessDataBase(ACCESS_DB_PATH);

  while (!Terminated) ServiceThread->ProcessRequests(False);

 }
__finally
 {
  DisConnectAccessDataBase();
 }
}


void __fastcall THotelStore::ConnectAccessDataBase(AnsiString PATH)
{

try
{
 AnsiString DataSource = ";Data Source="+PATH;
 CoInitialize;

 if (AccessConnect == NULL) AccessConnect = new TADOConnection(NULL);
 if (AccessConnect == NULL) throw Exception("Error create ADO");

 AccessConnect->LoginPrompt = false;
 AccessConnect->Mode = cmShareDenyNone;
 AccessConnect->ConnectionString = AccessProvider+DataSource;

 AccessConnect->Connected = true;

 AddEvent(etAccessDBConnected,PATH);
}
catch(Exception &Ex)
{
 ShowMessage(Ex.Message);
 AddEvent(etAccessDBErrConnected,PATH);
}

}


void __fastcall THotelStore::DisConnectAccessDataBase()
{

try
{
 if (AccessConnect == NULL) return;

 AccessConnect->Connected = false;
 delete AccessConnect;
 AddEvent(etAccessDBDisConnected);
 CoUninitialize;
}
catch(Exception &Ex)
{
 AddEvent(etAccessDBErrConnected,Ex.Message);
}

вот весь код инициализации ADO
да и кстати в дизайне этого компонента нет

}


 
sniknik ©   (2007-11-16 12:51) [18]

вроде все правильно, насколько могу судить о "вражеском" языке...

сделай так, проверь

void __fastcall THotelStore::ServiceExecute(TService *Sender)
{
try
 {
  ShowMessage("Шаг 1");
  ConnectAccessDataBase(ACCESS_DB_PATH);

  while (!Terminated) ServiceThread->ProcessRequests(False);

 }
__finally
 {
  DisConnectAccessDataBase();
 }
}

void __fastcall THotelStore::ConnectAccessDataBase(AnsiString PATH)
{

try
{
 AnsiString DataSource = ";Data Source="+PATH;
 ShowMessage("Шаг 2");
 CoInitialize;

 ShowMessage("Шаг 3");
 if (AccessConnect == NULL) AccessConnect = new TADOConnection(NULL); //кстати зачем условие? оно же всегда true сдесь, если только AccessConnect не обьявлен глобально а не метод класса... вот где может быть глюк.
 ShowMessage("Шаг 4");
 if (AccessConnect == NULL) throw Exception("Error create ADO");
....
и т.д. до какого шага доходит? (и есть ли повторы, т.е. нет ли повторения с 1 после одного прохода?, если есть то коннект сделанный в одном потоке не инициализирован в другом, сколько CoInitialize не вызывай)


 
sniknik ©   (2007-11-16 12:54) [19]

> а не метод класса
... переменная класса


 
Tonich ©   (2007-11-16 13:10) [20]

начица так, повторений нет
о ошибка возникает в тот момент когда я пытаюсь динамически создать компонент
if (AccessConnect == NULL) AccessConnect = new TADOConnection(NULL);
и условие я уже убрал..


 
Reindeer Moss Eater ©   (2007-11-16 13:17) [21]

А если два Coinitialize в OnCreate и в OnStart ?


 
sniknik ©   (2007-11-16 13:22) [22]

> о ошибка возникает в тот момент когда я пытаюсь динамически создать компонент
получается вызов CoInitialize до этого не сработал...

чтото типа
case CoInitialize() of
 S_OK : ShowMessage("S_OK");
 S_FALSE : ShowMessage("S_FALSE");
 E_OUTOFMEMORY : ...
 E_INVALIDARG : ...
 E_UNEXPECTED : ...
end;

.... посетила страшная мысль, а вдруг CoInitialize у тебя не тот CoInitialize... вдруг у тебя/в моделях задекларирован дубликат?


 
sniknik ©   (2007-11-16 13:24) [23]

> в моделях
в модулях

длин, чего это со мной сегодня... ;о(


 
Tonich ©   (2007-11-16 13:40) [24]


> Reindeer Moss Eater ©   (16.11.07 13:17) [21]

не помогает


> sniknik ©   (16.11.07 13:22) [22]

проверяю....


 
Tonich ©   (2007-11-16 13:42) [25]

S_OK

Indicates the library was initialized successfully.

после инициализации..
так кажется я понял в чем дело, сейчас проверю и скажу... так или нет


 
Tonich ©   (2007-11-16 14:07) [26]

блин.... писец просто
моя ошибка

CoInitialize;
CoInitialize(NULL)

компилится в любом случаи но передать NULL как параметр обязательно, ну в С++

все спасибо большое всем!! ))


 
Tonich ©   (2007-11-16 14:08) [27]

да и кстати размещать инициализацию можно и в OnStart...


 
sniknik ©   (2007-11-16 14:19) [28]

> но передать NULL как параметр обязательно, ну в С++
вот он "вражий" язык ;о), кто ж знал? в дельфи вызовы равнозначны. (по идее и там должны раз > S_OK)

> да и кстати размещать инициализацию можно и в OnStart...
ну это практически сразу "вычислили", как только Reindeer Moss Eater привел лог.


 
Tonich ©   (2007-11-16 14:46) [29]


> ну это практически сразу "вычислили", как только Reindeer
> Moss Eater привел лог.

согласен ссылаюсь на него )


 
sniknik ©   (2007-11-16 15:13) [30]

кстати, кажется догадался в чем дело (в незнании используемого языка ;о))
у тебя явно вызов CoInitialize; так написанный не делается, надо писать явно скобки (), как я написал в [22], правда чисто по привычке, т.к. в дельфи это равнозначно, но то в дельфи, а в C именно скобки говорят он необходимости вызова. написанное без них это просто адрес функции без операции...
а от пустой операции и возврат пустой - 0 т.е. S_OK (он тоже 0 случайно...:)...
вот, т.е., если я прав то  
> но передать NULL как параметр обязательно
именно параметр и не причем, но с параметром ты написал скобки (возможно хватило бы и пустых как в [22]), а вот они указали что надо сделать вызов...

p.s. пересмотри код, т.к. учитывая сказанное CoUninitialize; у тебя тоже не сработает, а их вызовы должны быть строго парными...


 
Reindeer Moss Eater ©   (2007-11-16 15:16) [31]

Гы. "И это все о нем".
С++

:)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.007 c
15-1203842812
Cerberus
2008-02-24 11:46
2008.04.06
Помогите с докладом.


2-1205390476
prorock
2008-03-13 09:41
2008.04.06
Ошибка при выходе с приложения


15-1203573447
Alex8
2008-02-21 08:57
2008.04.06
QuickReport


15-1203764136
Johnny
2008-02-23 13:55
2008.04.06
Замена сис. файлов WINDOWS


15-1203497699
md10
2008-02-20 11:54
2008.04.06
SQL and C Sharp





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