Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
4-1172960135
leonidus
2007-03-04 01:15
2007.08.19
Аналог GetAsyncKeyState для мыши


15-1185115628
Rubagl
2007-07-22 18:47
2007.08.19
Книга "Delphi. Готовые алгоритмы. " Нужны исходники.


2-1184705148
JetAPI
2007-07-18 00:45
2007.08.19
TListView; закрасить/затереть текст в колонке.


2-1185099170
Владимир Макарович
2007-07-22 14:12
2007.08.19
Вопросы по программированию


15-1185173044
Забыл пароль
2007-07-23 10:44
2007.08.19
Статья на рбк. Сможет кто-нить объяснить?