Форум: "Базы";
Текущий архив: 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