Форум: "Базы";
Текущий архив: 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