![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сервис и ADO [D7, Access]
DarekS © (2007-06-18 15:40:00)Сервис (Service Application) использует для доступа к БД Access компоненты ADO. Во время разработки компоненты корректно подключаются к базе. По сле запуска службы не возможно подключится путем установки Active:=true. Свойство всегда остается false. Сообщений об ошибке не поступает.
BDS 2006. Есть предположения?
П.С. Опыт не большой, не пинайте больно..
sniknik (2007-06-20 20:14:00) [1]> Так ведь Application из сервиса никуда не девается ...
так вроде execute сервиса это отдельный поток от основного, а в отдельных нужно отдельную инициализацию. т.к. не дай гейтс будет другой, или вызов com модели из основного... одному "ядру" придется обслуживать два потока... вот тебе и непонятные эксессы.
Однокамушкин (2007-06-20 15:55:00) [2]
> sniknik © (20.06.07 14:52) [31]
> > Инициализация оказалась тут ни при чем.. :-)) Лишняя.
> причем, даже если ты этого не понимаешь. без инициализации
> COM попросту не работает.
Так ведь Application из сервиса никуда не девается, а именно он инициализирует COM, если в этом есть необходимость: SvcMgr.Application.Initialize вызывает Forms.Application.Initialize, а оттуда вызывается InitProc, которая в initialization модуля ComObj переопределяется так, что там будет вызов CoInitiualize... Так что вручную потом и в самом деле ничего инициализировать не надо...
sniknik (2007-06-20 14:52:00) [3]> не запрещено, прекрасно вывожу сообщения об ошибке ShowMessage(), главное чтоб свойство Interactive=true
т.к. этого нет в вопросе, но сказано что ошибки тоже нет, хотя она должна быть. почему не прокомментировано сразу? что стоило в ответ на "службе запрещено взаимодействие с рабочим столом" сказать, что разрешение стоит (???), что толку говорить об этом после того как проблема решена? "Могу спокойно ответить", это типа после драки кулаками махать, никому не интересно...
> На этапе разработки и отладки пользуюсь этим постоянно и успешно :-)
оно и видно насколько успешно.
> Инициализация оказалась тут ни при чем.. :-)) Лишняя.
причем, даже если ты этого не понимаешь. без инициализации COM попросту не работает.
> Следовало вместо пользовательского, создать системный источник данных.
> Всего лишь :-)
вообще следовало бы не создавать DSN, а отказаться от устаревшего ODBC, но да ладно. варианты давали, решение за тобой.
DarekS (2007-06-20 13:58:00) [4]Следовало вместо пользовательского, создать системный источник данных.
Всего лишь :-)
DarekS (2007-06-20 13:55:00) [5]DVM
прокатило, псба :-)
DarekS (2007-06-20 13:53:00) [6]Запустил, работает. Могу спокойно ответить:
sniknik
1."т.к. службе запрещено взаимодействие с рабочим столом. пиши в лог"
не запрещено, прекрасно вывожу сообщения об ошибке ShowMessage(), главное чтоб свойство Interactive=true
2."> При попытке пуска службы с активным соединением..
этого нельзя делать не только в сервисах но и в простом приложении, во избежание различных "непонятных" эксцессов."
На этапе разработки и отладки пользуюсь этим постоянно и успешно :-)
3. "не хватает... инициализация COM, +разинициализвция. т.к. сервис это всеже не основной поток приложения."
Инициализация оказалась тут ни при чем.. :-)) Лишняя.
Сергей М.
"Почитай про CoInitialize/CoUninitialize."
Почитал, в даном случае не пригодилась.
Плохиш
Псба, не сразу догнал. С меня пиво!
DVM (2007-06-20 11:26:00) [7]
> sniknik © (20.06.07 11:03) [26]
> по моему это вы путаете с dll. с чего бы это ему "не прокатывать"?
Может быть и путаю. Вот автор сейчас придет и проверит.
sniknik (2007-06-20 11:03:00) [8]> Не прокатит само собой. Это я для примера просто написал. Свой путь вставь туда.
по моему это вы путаете с dll. с чего бы это ему "не прокатывать"?
DVM (2007-06-20 10:57:00) [9]
> DarekS (19.06.07 18:05) [23]
> Кста, на сколько мне известно, ExtractFilePath(ParamStr(0))
> с сервисом не прокатит..
Не прокатит само собой. Это я для примера просто написал. Свой путь вставь туда.
sniknik (2007-06-19 22:00:00) [10]> Если дело в ODBC - DSN, то каким образом тот же код работает в приложении, а в сервисе выдает ошибку?
разный юзер - разные права/настройки.
тебе же говорили про юзерский dsn, думаешь просто так к слову? все может влиять.
DarekS (2007-06-19 18:05:00) [11]sniknik
База без пароля. Обычные приложения работают с ней без логина\пароля.
Если дело в ODBC - DSN, то каким образом тот же код работает в приложении, а в сервисе выдает ошибку?
DVM
Пасибо, проверим завтра, рабочий день закончился.. :-)
Кста, на сколько мне известно, ExtractFilePath(ParamStr(0)) с сервисом не прокатит.. (тоже надо проверить)
sniknik (2007-06-19 16:55:00) [12]> это виноват CoInitialize не в том месте? Не похоже..
конечно не похоже, это проблему уже DSN-а одбсишного, либо не правильный либо не того юзера.
как это решишь, следующая проблема с логином/паролем, вводом. сколько про то не говорили, а в [19] нет нужной установки (и не может быть т.к. нет даже коннекта)
> код приведен только для примера
это радует.
Плохиш (2007-06-19 16:46:00) [13]
> DarekS (19.06.07 11:55) [11]
> Плохиш
> Под одним и тем же пользователем создаю источник данных,
> запускаю обычные приложенияи сервисы.
Ну, ну, наивный чукотский мальчик...
DVM (2007-06-19 16:30:00) [14]Пропиши попробуй в строке подключения явный путь к файлу бд.
AdoConnection.ConnectionString :=
'Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source=' + ExtractFilePath(ParamStr(0)) + 'db.mdb' + ';' +
'Jet OLEDB:Database Password=;';
DarekS (2007-06-19 16:13:00) [15]CoInitialize(NIL);
ADODataSet1:=TADODataSet.Create(nil);
ADODataSet1.Active:=false;
ADODataSet1.ConnectionString:='Provider=MSDASQL.1;Password="";Persist Security Info=True;Data Source=SendMail_SQL';
ADODataSet1.CommandText:='select ID,data,flag from TB1';
ShowMessage('Active- '+BoolToStr(ADODataSet1.Active));
try
ADODataSet1.Active:=true;
except
on E: EOleSysError do ShowMessage(E.Message);
end;
ShowMessage('Active- '+BoolToStr(ADODataSet1.Active));
код приведен только для примера, сообщение об ошибке:
[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию
это виноват CoInitialize не в том месте? Не похоже..
DarekS (2007-06-19 12:58:00) [16]И Вам того же :-))
"Пасибо, я Вас тоже очень люблю.." (с) Масяня
Anatoly Podgoretsky (2007-06-19 12:40:00) [17]> DarekS (19.06.2007 12:29:16) [16]
Ты еще не так опечалишься
DarekS (2007-06-19 12:29:00) [18]Я опечалился :-(
Сергей М. (2007-06-19 12:17:00) [19]
> DarekS
Самое печальное в твоей истории не незнание всяких там "инициализаций" (никто не может и не обязан знать все - на то есть справочники), а неумение и/или нежелание пользоваться встроенным отладчиком для локализации проблем в работе своего софта.
Сергей М. (2007-06-19 12:13:00) [20]
> При чем COM-подсистема ? Я об этом впервые слышу
Притом что ADO со стороны системы представляет собой СОМ-сервер астоматизации.
Почитай про CoInitialize/CoUninitialize.