Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
ВнизСервис и ADO Найти похожие ветки
← →
DarekS (2007-06-18 15:40) [0]Сервис (Service Application) использует для доступа к БД Access компоненты ADO. Во время разработки компоненты корректно подключаются к базе. По сле запуска службы не возможно подключится путем установки Active:=true. Свойство всегда остается false. Сообщений об ошибке не поступает.
BDS 2006. Есть предположения?
П.С. Опыт не большой, не пинайте больно..
← →
sniknik © (2007-06-18 15:52) [1]> Сообщений об ошибке не поступает.
да ну? может ты их просто не видиш? т.к. службе запрещено взаимодействие с рабочим столом. пиши в лог.
скорее всего (частый глюк) забыл у коннекта поставить не запрашивать логин/пароль вот он и запрашивает... там где не видно. "до победного".
> П.С. Опыт не большой, не пинайте больно..
тогда почему сдесь, а не в начинающих?
← →
DarekS (2007-06-18 17:20) [2]пароль-логин не запрашивает.
Во время разработки приложения проверяю соединение с базой. Вывожу содержимое таблицы гридом (для зрительной проверки). Все пучком. При пуске службы и последующей попытке активации свойство остается неактивным. При попытке пуска службы с активным соединением компоненты (ADOQuery, ADODataSet, ADOTable.Active:=true) ругается на отсутствие источника данных и драйвера по умолчанию. Хотя минутой раньше прекрасно отображал базу в гриде.. То же самое в обычном приложении работает без проблем.
Вопрос в этой ветке, т.к. у новичков врядли смогли бы мне помочь, а вопрос сугубо "базовый" , с другими компонентами сервис работает отлично..
← →
sniknik © (2007-06-18 20:11) [3]> пароль-логин не запрашивает.
было бы надежнее привести параметры показывающие что не запрашивает, чем словестные уверения. (в которые хоть "мамой клянусь все правильно сделал, а оно не работает" не поверю)
> При попытке пуска службы с активным соединением
этого нельзя делать не только в сервисах но и в простом приложении, во избежание различных "непонятных" эксцессов.
> а вопрос сугубо "базовый"
вот это врядли... судя по приведенному ADOTable, вопрос сугубо в "базовом профанстве".
← →
Anatoly Podgoretsky © (2007-06-18 20:33) [4]Ошибка сугубо в 17 строке.
← →
Германн © (2007-06-19 00:28) [5]
> Вопрос в этой ветке, т.к. у новичков врядли смогли бы мне
> помочь,
В корне неверное представление о направленности коференции "Начинающие". Отвечают во всех конференциях одни и те же люди.
← →
DarekS (2007-06-19 11:09) [6]Все такие вууумные.. :-))
Какой код приводить, если там всего 3 строчки?
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));
ADODataSet1.Active:=true;
ShowMessage("Active- "+BoolToStr(ADODataSet1.Active));
Для невнимательых:
ТОЧНО ТОТ САМЫЙ КОД в обычном приложении работает безупречно!
Глубокоуважаемый sniknik , если я ошибся в строке подключения (пароль или еще чего), то почему обычное приложение с такой же строкой подключения работает без проблем? Можете мне, скудоумному, объяснить этот феномен. У меня загвоздка не в подключении через ADO к базе Access, а в том ,что способ применяемый в обычном приложении не сработал в сервисе! Возможно вина самого BDS2006, проверю еще на Delphi6...
Пасибо всем за активное участье :-))
П.С. Надеялся на опыт тех кто работал с ADO из-под сервиса BDS2006...
← →
DarekS (2007-06-19 11:11) [7]После попытки
ADODataSet1.Active:=true;
сервис замирает..
← →
Плохиш © (2007-06-19 11:21) [8]
> Data Source=SendMail_SQL
А это создано на закладке "User-DNS"... Чего ж ты хочешь, нету у пользователя, под которым запускается сервер, этого источника данных.
← →
Сергей М. © (2007-06-19 11:26) [9]
> DarekS (19.06.07 11:11) [7]
Явную инициализацию COM-подсистемы за тебя кто будет делать - Пушкин ?
← →
sniknik © (2007-06-19 11:35) [10]> Все такие вууумные.. :-))
> Какой код приводить, если там всего 3 строчки?
двух не хватает... инициализация COM, +разинициализвция. т.к. сервис это всеже не основной поток приложения.
+ конечно, нехватает еще обработки ошибок, которых как говоришь у тебя нет...
и вот это ShowMessage... лишнее т.к. ... см обьяснение [3].
> ТОЧНО ТОТ САМЫЙ КОД в обычном приложении работает безупречно!
вот я и думаю почему катер по городу не едет? ведь он ТОЧНО В ПОРЯДКЕ т.к. по морю идет в легкую...
> проверю еще на Delphi6...
не стоит не в дельфе ошибка, будет тоже самое.
> П.С. Надеялся на опыт тех кто работал с ADO из-под сервиса BDS2006...
а по вопросу и остальному (до [6] где есть хоть чтото) кажется что хочеш поговорить... иначе к чему "описательные" обьяснения вместо пары строк кода, что и описывает лучше и место кривотолкам не оставляет...
← →
DarekS (2007-06-19 11:55) [11]Плохиш
Под одним и тем же пользователем создаю источник данных, запускаю обычные приложения и сервисы. Приложения через ADO работают c БД Access - а сервисы с той же строкой подключения, нет! Никакой закладки "User-DNS" не встречал, база вяляется на том же компе.. Проверяю подключение ,все ок! Или сервись надо пускать не "просто", а от какого то имени? Тогда, каким образом?
При чем COM-подсистема ? Я об этом впервые слышу :-)
← →
DarekS (2007-06-19 11:57) [12]И кто мне расскажет про COM - подсистему..?
sniknik
я стал лаконичен, правда?
← →
sniknik © (2007-06-19 12:06) [13]> Никакой закладки "User-DNS" не встречал, база вяляется на том же компе..
подключение (строка) через ODBC, и хочеш сказать не видел где DSN создавал? юзеровский или системный.
> При чем COM-подсистема ? Я об этом впервые слышу :-)
самое время просветится.
а еще, раз спрашиваешь, перестань считать что знаеш что нужно для ответа. не "выкобенивался" бы, давно бы ктонибудь подсказал. нормально, кодом, а не "описательно" в ответ на "описательный" вопрос.
> я стал лаконичен, правда?
от тебя как раз требуется совсем другое. раз нужно тебе, то ты должен предоставлять ВСЮ необходимую инфу о том что там у тебя происходит/сделано, а если не знаеш что необходимо то просто ВСЮ.
← →
Сергей М. © (2007-06-19 12:13) [14]
> При чем COM-подсистема ? Я об этом впервые слышу
Притом что ADO со стороны системы представляет собой СОМ-сервер астоматизации.
Почитай про CoInitialize/CoUninitialize.
← →
Сергей М. © (2007-06-19 12:17) [15]
> DarekS
Самое печальное в твоей истории не незнание всяких там "инициализаций" (никто не может и не обязан знать все - на то есть справочники), а неумение и/или нежелание пользоваться встроенным отладчиком для локализации проблем в работе своего софта.
← →
DarekS (2007-06-19 12:29) [16]Я опечалился :-(
← →
Anatoly Podgoretsky © (2007-06-19 12:40) [17]> DarekS (19.06.2007 12:29:16) [16]
Ты еще не так опечалишься
← →
DarekS (2007-06-19 12:58) [18]И Вам того же :-))
"Пасибо, я Вас тоже очень люблю.." (с) Масяня
← →
DarekS (2007-06-19 16:13) [19]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 не в том месте? Не похоже..
← →
DVM © (2007-06-19 16:30) [20]Пропиши попробуй в строке подключения явный путь к файлу бд.
AdoConnection.ConnectionString :=
"Provider=Microsoft.Jet.OLEDB.4.0;"+
"Data Source=" + ExtractFilePath(ParamStr(0)) + "db.mdb" + ";" +
"Jet OLEDB:Database Password=;";
← →
Плохиш © (2007-06-19 16:46) [21]
> DarekS (19.06.07 11:55) [11]
> Плохиш
> Под одним и тем же пользователем создаю источник данных,
> запускаю обычные приложения и сервисы.
Ну, ну, наивный чукотский мальчик...
← →
sniknik © (2007-06-19 16:55) [22]> это виноват CoInitialize не в том месте? Не похоже..
конечно не похоже, это проблему уже DSN-а одбсишного, либо не правильный либо не того юзера.
как это решишь, следующая проблема с логином/паролем, вводом. сколько про то не говорили, а в [19] нет нужной установки (и не может быть т.к. нет даже коннекта)
> код приведен только для примера
это радует.
← →
DarekS (2007-06-19 18:05) [23]sniknik
База без пароля. Обычные приложения работают с ней без логина\пароля.
Если дело в ODBC - DSN, то каким образом тот же код работает в приложении, а в сервисе выдает ошибку?
DVM
Пасибо, проверим завтра, рабочий день закончился.. :-)
Кста, на сколько мне известно, ExtractFilePath(ParamStr(0)) с сервисом не прокатит.. (тоже надо проверить)
← →
sniknik © (2007-06-19 22:00) [24]> Если дело в ODBC - DSN, то каким образом тот же код работает в приложении, а в сервисе выдает ошибку?
разный юзер - разные права/настройки.
тебе же говорили про юзерский dsn, думаешь просто так к слову? все может влиять.
← →
DVM © (2007-06-20 10:57) [25]
> DarekS (19.06.07 18:05) [23]
> Кста, на сколько мне известно, ExtractFilePath(ParamStr(0))
> с сервисом не прокатит..
Не прокатит само собой. Это я для примера просто написал. Свой путь вставь туда.
← →
sniknik © (2007-06-20 11:03) [26]> Не прокатит само собой. Это я для примера просто написал. Свой путь вставь туда.
по моему это вы путаете с dll. с чего бы это ему "не прокатывать"?
← →
DVM © (2007-06-20 11:26) [27]
> sniknik © (20.06.07 11:03) [26]
> по моему это вы путаете с dll. с чего бы это ему "не прокатывать"?
Может быть и путаю. Вот автор сейчас придет и проверит.
← →
DarekS (2007-06-20 13:53) [28]Запустил, работает. Могу спокойно ответить:
sniknik
1."т.к. службе запрещено взаимодействие с рабочим столом. пиши в лог"
не запрещено, прекрасно вывожу сообщения об ошибке ShowMessage(), главное чтоб свойство Interactive=true
2."> При попытке пуска службы с активным соединением..
этого нельзя делать не только в сервисах но и в простом приложении, во избежание различных "непонятных" эксцессов."
На этапе разработки и отладки пользуюсь этим постоянно и успешно :-)
3. "не хватает... инициализация COM, +разинициализвция. т.к. сервис это всеже не основной поток приложения."
Инициализация оказалась тут ни при чем.. :-)) Лишняя.
Сергей М.
"Почитай про CoInitialize/CoUninitialize."
Почитал, в даном случае не пригодилась.
Плохиш
Псба, не сразу догнал. С меня пиво!
← →
DarekS (2007-06-20 13:55) [29]DVM
прокатило, псба :-)
← →
DarekS (2007-06-20 13:58) [30]Следовало вместо пользовательского, создать системный источник данных.
Всего лишь :-)
← →
sniknik © (2007-06-20 14:52) [31]> не запрещено, прекрасно вывожу сообщения об ошибке ShowMessage(), главное чтоб свойство Interactive=true
т.к. этого нет в вопросе, но сказано что ошибки тоже нет, хотя она должна быть. почему не прокомментировано сразу? что стоило в ответ на "службе запрещено взаимодействие с рабочим столом" сказать, что разрешение стоит (???), что толку говорить об этом после того как проблема решена? "Могу спокойно ответить", это типа после драки кулаками махать, никому не интересно...
> На этапе разработки и отладки пользуюсь этим постоянно и успешно :-)
оно и видно насколько успешно.
> Инициализация оказалась тут ни при чем.. :-)) Лишняя.
причем, даже если ты этого не понимаешь. без инициализации COM попросту не работает.
> Следовало вместо пользовательского, создать системный источник данных.
> Всего лишь :-)
вообще следовало бы не создавать DSN, а отказаться от устаревшего ODBC, но да ладно. варианты давали, решение за тобой.
← →
Однокамушкин (2007-06-20 15:55) [32]
> sniknik © (20.06.07 14:52) [31]
> > Инициализация оказалась тут ни при чем.. :-)) Лишняя.
> причем, даже если ты этого не понимаешь. без инициализации
> COM попросту не работает.
Так ведь Application из сервиса никуда не девается, а именно он инициализирует COM, если в этом есть необходимость: SvcMgr.Application.Initialize вызывает Forms.Application.Initialize, а оттуда вызывается InitProc, которая в initialization модуля ComObj переопределяется так, что там будет вызов CoInitiualize... Так что вручную потом и в самом деле ничего инициализировать не надо...
← →
sniknik © (2007-06-20 20:14) [33]> Так ведь Application из сервиса никуда не девается ...
так вроде execute сервиса это отдельный поток от основного, а в отдельных нужно отдельную инициализацию. т.к. не дай гейтс будет другой, или вызов com модели из основного... одному "ядру" придется обслуживать два потока... вот тебе и непонятные эксессы.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.15;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.043 c