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

Вниз

ADO + TServices   Найти похожие ветки 

 
ak   (2003-01-02 11:12) [0]

Доброе время суток, соплеменники.
Ну, для начала, ВСЕХ С НОВЫМ ГОДОМ! Желаю всем море радости, счастья,
успехов в личной жизни.
Есть такой вопрос.
Cуть в следующем.
Сначала я написал программу (с формочкой) в которой с помощью АДО
обращался к базе MS Access, отладил ее, все работало здорово. Потом
решил переделать это дело под сервис. С нуля создал проект, написал
все как положено, НО не работает. Происходит ошибка при попытке
подключения к базе. Вот фрагмент:
with dmVoIP do //dmVoIP - Data Module
begin
//берем настройки подключения к базе из файла VoIP2DB.udl в "своем" каталоге
cntBase.ConnectionString:="FILE NAME="+ExtractFilePath(ParamStr(0))+"VoIP2DB.udl";
cntBase.Open("",""); // ПРОИСХОДИТ ОШИБКА!!!!
dstBase.Connection:=cntBase; //связываем TADODataSet и TADOConnect
dstBase.CommandType:=cmdTable; //работаем с таблицей
dstBase.CommandText:="VoIP - журнал"; //работаем с таблицей "телефонный журнал"
dstBase.Active:=true; //активируем TADODataSet
end;
Ошибка происходит при выполнении функции OPEN() класса TADOConnect.
Весь прикол в том, что если я все это делаю через Обжект Инспектор, то
база открывается! Я искал ответы в разных статьях в инете, в книгах,
но ничего не нашел :( Наверняка, глупость какая-то. Может вы,
уважаемые, подскажите в чем тут дело?


 
Anatoly Podgoretsky ©   (2003-01-02 11:17) [1]

А от имени какого пользователя стартует твой сервис, не с этим ли дело?


 
ak   (2003-01-02 11:48) [2]

У меня стоит все по дефолту. Я сижу с админскими правами, значит и сервис запускается с ними же. Или нет?


 
sniknik ©   (2003-01-02 11:51) [3]

При работе с базой в сервисе нужно делать
CoInitialize(nil);
...
CoUnInitialize();

???


 
ak   (2003-01-02 11:56) [4]

2 sniknik
А можно чуточку подробнее? Буду благодарен.


 
sniknik ©   (2003-01-02 12:15) [5]

куда подробнее, все сказано

если хочеш вышлю пример, у меня там из сервиса в базу всякая х$#%я пишется. :-))

правда там немного усложнение, работа с базой в dll а уже ее метод в сервисе вызывается (просто тут с одним спорили я все никак не мог понять почему у него не dll так работает вот и написал, но так и не понял, заработало с первого раза) но думаю поймеш там всего пара прцедур. (а чего еще, пример все же).


 
ak   (2003-01-02 12:18) [6]

2 sniknik.
Давай, примерчик - то что нужно.
sid_4all@mail.ru


 
ak   (2003-01-02 12:20) [7]

2 sniknik.
Просто я раньше ДЛЛки не писАл. Теперь разбираюсь, что за "CoInitialize" такое.


 
ak   (2003-01-02 12:26) [8]

2 sniknik
Сделал следующее:
1) uses ActiveX;
2) перед присоединением к базе написал coinitialize(nil). Эффект тот же.


 
sniknik ©   (2003-01-02 12:29) [9]

Послал. и вроде ушло. :-) напиши как получиш а то с рамблером бывают глюки :-(.

да еще там пути к базе и т.д. глобальные поправь, или ложи все тудаже D:\Work\DllADNService\* как у меня.


 
sniknik ©   (2003-01-02 12:30) [10]

> ak (02.01.03 12:26)
разбери сначала пример, проще чем выяснять что не так.


 
ak   (2003-01-02 12:31) [11]

2 sniknik.
Получил, спасибо. Сейчас на обед, а потом РАЗБИРАТЬСЯ!!!


 
ak ©   (2003-01-03 18:43) [12]

2 sniknik.
Разобрался с примерчиком, прочитал кучу инфы по написанию dll и COM. Честно говоря не совсем понял зачем нужно использовать CoInitialize() и CoUnInitialize в моем случае, но на всякий случай попробовал. Теперь получилось что-то типа:
...
coinitialize(nil);
with dmVoIP do //dmVoIP - Data Module
begin
//берем настройки подключения к базе из файла VoIP2DB.udl в "своем" каталоге
cntBase.ConnectionString:="FILE NAME="+ExtractFilePath(ParamStr(0))+"VoIP2DB.udl";
cntBase.Open("",""); // ПРОИСХОДИТ ОШИБКА!!!!
dstBase.Connection:=cntBase; //связываем TADODataSet и TADOConnect
dstBase.CommandType:=cmdTable; //работаем с таблицей
dstBase.CommandText:="VoIP - журнал"; //работаем с таблицей "телефонный журнал"
dstBase.Active:=true; //активируем TADODataSet
end;
CoUnInitialize;
...
Эффекта никакого. Ошибка как была, так и осталась. Может я что-то не так делаю? Есть еще варианты? Вся работа застряла на этом :(


 
sniknik ©   (2003-01-03 19:34) [13]

ParamStr(0) в сервисе? уверен? лутше пропиши абсолютный путь пока (101-й способ :-))).

пример то работает? вот и делай так же.

и совет "cntBase.ConnectionString:= ...." не делай так, заведи отдельный коннект "ADOConnection.ConnectionString <- пиши здесь", на него все и вяжи. (поверь так лутше, ведь у тебя не единственная таблица? )


 
sniknik ©   (2003-01-03 20:21) [14]

извини ParamStr(0) работает проверил.
Кстати и с конектом в предыдущем посте напутал, он у тебя просто называется так странновато (для меня).
попробуй заменить
cntBase.Open("","");
на
cntBase.LoginPrompt:= false;
cntBase.Open;
может быть, не получится проверяй udl, в exe-шном варианте работает?


 
ak ©   (2003-01-03 21:03) [15]

2 sniknik.
> пропиши абсолютный путь
Это я уже делал.

> он у тебя просто называется так странновато
да я просто с VB начинал, оттуда и привычка :)

> cntBase.LoginPrompt:= false;
> cntBase.Open;
попробую, но не думаю что это поможет, т.к. я пробовал:
cntBase.LoginPrompt:= false;
cntBase.Connected:=true;

> проверяй udl
причина не в нем 100% я его тестил. Еще пробовал без УДЛ работать, ручками параметры прописывать.

> в exe-шном варианте работает?
в том-то и весь прикол, что ДА.
Если интересно, могу исходники прислать и сервиса и ЕХЕшника - сам посмотришь


 
asmith   (2003-01-03 21:37) [16]

А какое конкретно выдается сообщение об ошибки или какой код ошибки? От чьего имени стартует сервис?


 
ak ©   (2003-01-03 21:58) [17]

2 asmith.
1) когда работает сервис сообщений об ошибке не возникает.
2) от системного.


 
sniknik ©   (2003-01-03 22:11) [18]

ak © (03.01.03 21:03)
шли посмотрю (завтра на работе). не обещаю, но посмотрим.


 
ak ©   (2003-01-03 22:19) [19]

2 sniknik.
Хорошо, но только прислать завтра смогу, т.к. у меня все это добро на работе находится.


 
ak ©   (2003-01-04 00:18) [20]

2 sniknik.
Выслал.


 
sniknik ©   (2003-01-04 12:00) [21]

у меня все гладко сработало
сделал изменения
1 coinitialize(nil); вынес из with поставил на начало процедуры
{begin
coinitialize(nil);
...}
2 перед end процедуры вставил couninitialize;
3 заменил akWriteErr2File(" akInitBase - Connection:= cntBase");
на
akWriteErr2File(" akInitBase - Connection:= "+cntBase.ConnectionString); (понятно зачем?)
4 в udl из разрешений убрал ReadWrite оставил только Share Deny None.
5 ну и естественно пути свои.

вот выданный лог
04.01.2003 11:28:33 - ServiceStart - вход
04.01.2003 11:28:33 - akInitBase - вход
04.01.2003 11:28:33 - akInitBase - ConnectionString
04.01.2003 11:28:33 - akInitBase - open
04.01.2003 11:28:33 - akInitBase - Connection:= Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=D:\Test\ado\atlc.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don"t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
04.01.2003 11:28:33 - akInitBase - выход
04.01.2003 11:28:33 - ServiceStart - выход

заметно что коннект открылся, и нет "akInitBase - ошибка!" кстати вместо последнего поставь чтото вроде
except
on E: EADOError do begin ErrMessage:= "EADOError : "+ E.Message; Err:= True; end;
on E: EOleException do begin ErrMessage:= "EOleException : "+ E.Message; Err:= True; end;
on E: EDataBaseError do begin ErrMessage:= "EDataBaseError : "+ E.Message; Err:= True; end;
else begin ErrMessage:= "Неизвестная ошибка!"; Err:= True; end;
end;

if Err then akWriteErr2File(ErrMessage);
понятнее будет.



 
ak ©   (2003-01-04 13:55) [22]

2 sniknik.

> 1 coinitialize(nil); вынес из with поставил на начало процедуры
> 2 перед end процедуры вставил couninitialize;

Я это делал, но видать не сохранил изменения и так тебе отправил. У меня это не сработало.

> 3 заменил akWriteErr2File(" akInitBase - Connection:= cntBase");
> на
> akWriteErr2File(" akInitBase - Connection:= "+cntBase.ConnectionString); (понятно зачем?)

Да, понятно. И че я сам не допер!

> 4 в udl из разрешений убрал ReadWrite оставил только Share Deny None.

А вот это я не пробовал делать! Сейчас же на работу побегу, тестить!!!

Слушай, а ты ведь опыт в кодинге вроде как и побольше меня имеешь, можешь оценить "правильность" кода? Какие мои основные ошибки? Ну есть же там "неписанные" правила всякие. Хочется писАть более профессионально :о)


 
sniknik ©   (2003-01-04 14:39) [23]

> оценить "правильность" кода
непонятно написано (на мой взгляд), комментарии не спасают (часто не в тему на очевидные вещи только засорение кода), отступы не везде (нет групировок по блокам), но если тебе понятно то почему нет, пусть будет.

а правила, да плевать на них главное работает или нет (правда могут на работу не взять, есть такой критерий оценка кода)

хочеш посмотреть как я пишу (стиль) скачай с кладовки TestMdb (мое творение) зацениш, тоже стиль далек от совершенства но зато прога полезная (раз с ADO работаеш будет в помощ).


 
ak ©   (2003-01-04 15:29) [24]

2 sniknik.
Сделал все как ты сказал, один в один и нихрена не заработало!
Меня стали терзать смутные сомнения. Взял экзешник, пошел за другой комп и ... я чуть не разрыдался!!! Там все как часики пашет! Так обидно стало! Правда то что ты мне сказал сделать все равно было необходимо.
В общем, сейчас все круто. Спасибо большое за помощь.

На счет кода. Да мне все в нем понятно, но было бы глупо если бы я сам там не мог разобраться. На твои замечания внимание обратил, так что может поменяю стиль.
А прогу твою сейчас скачаю.





Страницы: 1 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
14-72534
yankee
2003-01-07 21:31
2003.01.23
BD Emage Editor


1-72317
Шишкин Илья
2003-01-15 17:25
2003.01.23
В чём ошибка?


1-72262
laser
2003-01-14 21:31
2003.01.23
помогите пожалуйста разобрать (что-то не работает)


1-72316
kull
2003-01-15 18:00
2003.01.23
Нужен предок для написания дерева..


6-72438
Walker
2002-11-17 02:40
2003.01.23
IS филтры