Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.01.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 1.035 c
14-72470
RV
2003-01-05 09:52
2003.01.23
Дайте ссылку на программу или саму программу API_mon


3-72069
salvo
2003-01-06 13:55
2003.01.23
доступ к таблицам


14-72504
Юров Владимир
2003-01-06 18:18
2003.01.23
Win2000+Win2000


7-72545
DimaK
2002-11-11 00:14
2003.01.23
Помогите разобраться с изменением разрешения экрана


3-72165
Black Cat
2003-01-02 11:45
2003.01.23
ORA-04021 (таймаут операции блокировки)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский