Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1184496516
vegarulez
2007-07-15 14:48
2007.08.19
Эдит энабле:=фалсе, как сделать фонт цветом, как в труе?


15-1185125141
Sdubaruhnul
2007-07-22 21:25
2007.08.19
Москвичи или это я гоню?


2-1185347898
Kolan
2007-07-25 11:18
2007.08.19
Чем работать с DBF файлами


11-1168189124
mixail_shar
2007-01-07 19:58
2007.08.19
что такое 7z


1-1181132166
ILUT
2007-06-06 16:16
2007.08.19
Работа с буфером





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский