Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сервис и ADO [D7, Access]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо