Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизTService и доступ к базе данных Найти похожие ветки
← →
Nemec © (2007-05-01 09:57) [0]Здравствуйте!
Такая проблема.
Надо написать сервис (TService) из которого осуществляется доступ к базе данных (SyBase).
При попытке коннекта ADOConnection (именно из сервиса), соединение ни в какую не устанавливается. Может кто сталкивался?
← →
atruhin © (2007-05-01 10:23) [1]Посмотри права сервиса. От какой учетной записи стартует.
← →
sniknik © (2007-05-01 10:35) [2]> Может кто сталкивался?
нет ты первый такой уникальный... с 2000 года из миллионов программистов...
да тут раз в неделю практически вопрос както с этим связанный, распространенные ошибки ->
не инициализация COM чего в нормальном варианте делается автоматически в какомто из используемых модулей. (CoInitialize)
и забывают отключить запрос пароля (LoginPrompt), так его форма там и висит в "нигде" без доступа к рабочему столу... и естественно не подключается, некому там ввод нажать.
ну еще одна самая распространенная ошибка 17-й строки... но ее так просто не решишь...
← →
Nemec © (2007-05-01 19:57) [3]atruhin © (01.05.07 10:23) [1]
Посмотри права сервиса. От какой учетной записи стартует.
С системной учетной записью.
LoginPromt - отключен.
Я сейчас просто разместил на TService компонент ADOConnection и пытаюсь его открыть. Пишет служба не ответила вовремя.
Может какие нюансы при работе в сервисе. Впервые столкнулся с такой проблемой.
← →
Сергей М. © (2007-05-02 08:38) [4]
> Nemec © (01.05.07 19:57) [3]
> Пишет служба не ответила вовремя
Потому что в службе произошло необработанное исключение.
А произошло оно из-за отсутствия OLE/COM-инициализации.
см. CoInitialize, CoUninitialize.
← →
Nemec © (2007-05-02 18:56) [5]Сергей М.
Спасибо, будем разбираться как это работает.
← →
sniknik © (2007-05-02 19:28) [6]> Спасибо, будем разбираться как это работает.
т.е. чтобы начать разбираться нужно чтобы 2 раза повторили...?
ну тоды оставшееся "за кадром" - еще одна, самая распространенная ошибка - ошибка в 17й строке.
← →
Nemec © (2007-05-02 19:41) [7]/i sniknik/i
Юмор - это конечно хорошо. Вся беда, что я понятия не имею, как работает COM, никогда не сталкивался. А насчет "2 раза повторили" - иногда нужен хороший пинок, чтобы голова начала работать. В любом случае спасибо.
← →
sniknik © (2007-05-02 20:33) [8]а это не юмор, жестокая проза жизни... ошибки очень часто находят (если находят) не там где искали.
> понятия не имею, как работает COM
а на сервисах надо полагать "собаку сьел" и там ошибки ну никак быть не может... ?
вот. я об этом.
кстати,если действительно хорошо знаеш сервисы, то есть вопрос. не ВОПРОС который надо решать, а так вопрос, просто любопытно. может расскажешь что почем.
← →
Nemec © (2007-05-02 20:55) [9]Не буду утверждать, что я большой дока в сервисах, но много раз писал и проблем с ними не возникало. Наверное задачи были не сложные. Сам понимаешь, учишься по мере поступления щапросов. Вот сейчас столкнулся с тем, что надо из сервиса получить доступ к базе данных. Читаю разные примеры, пробую, если честно пока ничего не получается. Но знать, что надо прописывать COM для доступа к базе - видишь сам даже не догадался. Пока ясно одно, ситать много. Евли есть желание подкинь пример для старта: где и как его запустить - этот самый COM.
← →
Nemec © (2007-05-02 20:57) [10]/i sniknik /i
вот что пока нашел в инете, подскажи, что не так?
procedure TService1.ServiceExecute(Sender: TService);
begin
Try
CoInitializeEx(nil, 0);
ADOConnection1.Open;
while not Terminated do
begin
ADOQueryTable.SQL.Clear;
ADOQueryTable.SQL.Add("Update RunKlass Set RunKlassLgota=1");
ADOQueryTable.ExecSQL;
Sleep(1000);
ServiceThread.ProcessRequests(True);
end;
finally
Sleep(1000);
ADOConnection1.Close;
CoUninitialize;
end;
end;
← →
Nemec © (2007-05-02 21:06) [11]Использовал CoInitialize(nil); вроде получилось, но винда сервис остановила, говорит "Некоторые службы останавливаются, если не используются друшгими службами или программами"
← →
sniknik © (2007-05-02 21:33) [12]> вот что пока нашел в инете, подскажи, что не так?
а мы разве обсуждаем найденное в инете? разве? а не тобой написанное с чем у тебя проблемы.
> говорит "Некоторые службы останавливаются, если не используются друшгими службами или программами"
у тебя (вернее не у тебя, а в найденном в инете) служба останавливается...
выполняет запрос и останавливается, просто выходя из ServiceExecute.
> но много раз писал и проблем с ними не возникало.
о:)))) оно и видно, судя по коду, многоооо раз. 2 или даже три... как счет у доисторического человека - раз, два, много.
хотя о чем это я, это не твой код, ты за него не отвечаешь. это найдено в инете.
← →
sniknik © (2007-05-02 21:41) [13]> у тебя (вернее не у тебя, а в найденном в инете) служба останавливается...
стоп. сори. не обратил внимания на цикл. (не заметил что он есть)
а так хоть и "криво" написано, но должно работать. с учетом того конечно, что
> LoginPromt - отключен.
и нет другой ошибки, после которой идет вылет, а ошибка естественно не обрабатывается. (пиши ее в файл, увидишь хоть отчего вылетает. а то что вылетает точно)
← →
Nemec © (2007-05-02 21:49) [14]Я сейчас не о коде пекусь, а о том как его запустить. Поэтому о кривизне кода не будем. Хорошо? Правильно - это пример с инета, до того как писать самому, надо хотя бы понять, что и где запускать. Дело в том, что ADOQueryTable.ExecSQL; не работает, в базе нет изменений. Почему не могу понять. Вылет я уже устранил.
← →
sniknik © (2007-05-02 21:56) [15]> Поэтому о кривизне кода не будем. Хорошо?
ну если тебе неважно знать от чего ошибка, то не будем. т.к. главную "кривизну" я вижу в ее не обработке.
> ADOQueryTable.ExecSQL; не работает, в базе нет изменений.
значит вылет идет до него или во время него, до завершения команды не доходит.
> Вылет я уже устранил.
не знаю что ты уже устранил, но чтото еще есть.
← →
Nemec © (2007-05-02 22:13) [16]Насчет кривизны кода, прошу прощения. Но ведь и пример банальный.
Скидываю в файл каждый шаг. Спасибо за совет.
ADOConnection1 не открывается, создает исключение.
Вопрос: имеет значение на каком этапе инициализировать COM объект, на этапе старта сервиса или именно перед открытием ADOConnection? Вопрос банальный, но в самом деле тема новая.
← →
sniknik © (2007-05-02 22:34) [17]> Скидываю в файл каждый шаг.
достаточно отловленной ошибки.
> ADOConnection1 не открывается, создает исключение.
нет такой ошибки "создает исключение"
> имеет значение на каком этапе инициализировать COM объект
до любого обращения, и это не инициализация какогото обьекта COM, это инициализация вообще всей объектной модели COM.
> Вопрос банальный, но в самом деле тема новая.
откуда тебе знать что банальный если тема новая? блин, ну вот ничего не знают, зато знают что вопрос простой... чего ж вы его тогда сами не решите раз просто?
← →
Nemec © (2007-05-02 22:42) [18]Ладно не ругайся. Спасибо за совет. Скинул в файл код и описание ошибки.
Выдает следующее: "-2147467259[Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию".
Но ADOConnection настроен вроде правильно, во всяком случае я его так настраиваю на формах и работает.
← →
Nemec © (2007-05-02 22:56) [19]Строка соединения "Provider=MSDASQL.1;Persist Security Info=False;Data Source=AnyCenter;"
Создал такой же на форме отлично работает, в сервисе ни в какую. Запрос череp ODBC, сама база на удаленной машине.
← →
sniknik © (2007-05-02 23:55) [20]> Но ADOConnection настроен вроде правильно, во всяком случае я его так настраиваю на формах и работает.
а "лежащий" на сервисе в дизайне активируется? проверь, сделай активным, удалось? перед компиляцией закрой (открытый в дизайне дельфя откроет (будет пытаться) задолго до инициализации COM)
если коннект в дизайн тайм есть, а в работающем драйвер не находится... значит прав на него нет из сервиса (либо прав на DSN, не может реестр прочитать, попробуй строку без DSN(AnyCenter), с указанием драйвера и всех параметров в строке подключения. (в мастере подключения ODBC, источник данных не "имя источника" а "использовать строку подключения", и вместо DSN=AnyCenter руками подставить DRIVER={xxxxxx})).
← →
sniknik © (2007-05-03 00:01) [21]> не может реестр прочитать
кстати запросто может быть что драйвера установлены из под текущего юзера и только для него, под системным в ветке CurrentControlSet(или типа того, не помню) реестра попросту ничего нет... попробуй запустить сервис от текущего, от которого работает.
← →
Nemec © (2007-05-03 06:24) [22]sniknik
Спасибо большое, все дело было в правах на драйвера. Они родные стояли только на текущего юзверя. Теперь все пошло. Еще раз спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.038 c