Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO + TServices [D6]


Страницы:   1 2

ak ©   (2003-01-02 11:12:00) 

Доброе время суток, соплеменники.
Ну, для начала, ВСЕХ С НОВЫМ ГОДОМ! Желаю всем море радости, счастья,
успехов в личной жизни.
Есть такой вопрос.
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.
Весь прикол в том, что если я все это делаю через Обжект Инспектор, то
база открывается! Я искал ответы в разных статьях в инете, в книгах,
но ничего не нашел :( Наверняка, глупость какая-то. Может вы,
уважаемые, подскажите в чем тут дело?


ak   (2003-01-04 15:29:00) [1]

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

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



sniknik   (2003-01-04 14:39:00) [2]

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

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

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


ak   (2003-01-04 13:55:00) [3]

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 12:00:00) [4]

у меня все гладко сработало
сделал изменения
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 00:18:00) [5]

2 sniknik.
Выслал.


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

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


sniknik   (2003-01-03 22:11:00) [7]

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


ak   (2003-01-03 21:58:00) [8]

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


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

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


ak   (2003-01-03 21:03:00) [10]

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

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

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

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

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


sniknik   (2003-01-03 20:21:00) [11]

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


sniknik   (2003-01-03 19:34:00) [12]

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

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

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


ak   (2003-01-03 18:43:00) [13]

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;
...
Эффекта никакого. Ошибка как была, так и осталась. Может я что-то не так делаю? Есть еще варианты? Вся работа застряла на этом :(


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

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


sniknik   (2003-01-02 12:30:00) [15]

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


sniknik   (2003-01-02 12:29:00) [16]

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

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


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

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


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

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


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

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


sniknik   (2003-01-02 12:15:00) [20]

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо