Форум: "Базы";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Внизактивный ADO connection при запуске аппликации Найти похожие ветки
← →
a_smith (2002-09-17 14:36) [0]Коллеги! Имеет место следующая ситуация:
1. Аппликация использует ADO-компоненты для доступа к СУБД
2. Компоненту TADOConnection в дизайнере задана ConnectionString с параметрами, используемыми при разработке
3. Иногда, например после модификации структуры таблиц, TADOConnection остается в активном состоянии и аппликация по недосмотру может в таком виде уйти заказчику. Результат - при запуске сообщение о невозможности соединиться с сервером (TADOConnection.Connected:=True и присоздании модуля данных сразу выполняется коннект), затем штатный LogonDialog, вводятся правильные параметры соединения и успешный запуск.
4. При использовании BDE достаточно было в конструкторе модуля данных сразу после ввхода в него убить коннект, задать правильные параметры и все было ОК, поскольку инсталлятор аппликации сразу прописывал в BDE-алиас правильное имя сервера
5. С ADO выход пока не найден; прверялись варианты с использованием событий BeforeConnect, WillConnect, с перекрытием метода AfterConstruction модуля данных.
На мой взгляд, единственный выход - вмешиваться к вычитывание ресурса модуля данных при его создании и сбрасывать значение считанного свойства TADOConnection.Connected.
Может ли кто-нибудь предложить более простое и изящное решение этой проблемы.
← →
3JIA9I CyKA (2002-09-17 15:25) [1]1) ПРИЛОЖЕНИЕ!
2) Пишите в реестр при установке.
3) Читайте при запуске.
4) Удачи.
← →
sniknik (2002-09-17 15:42) [2]сделай *.udl файл и всегда используй его в ConnectionString, храни его рядом с exe - шником, легко перенастроить на правильные значения.
← →
a_smith (2002-09-17 16:11) [3]Вы оба невнимательно прочли описание проблемы. Все это уже есть! Но проблема не втом, где хранить и откуда брать параметры запуска, а в том что коннекция осталась активной в момент компилляции и при запуске в другой среде такая аппликация СРАЗУ же попытается соединиться с сервером, которого скорее всего просто нет. А держать строку соединения при разработке очень удобно - часто нужно перечитать метаданные и прочие вещи.
← →
sniknik (2002-09-17 16:19) [4]а ты не внимателен к ответам.
если она СРАЗУ же пытается соеденится то перестрой параметры в udl файле и нехай соеденяется ведь параметр уже будет правильный.
← →
Андрей Прокофьев (2002-09-17 16:25) [5]Вариант с UDL файлом - хорошее решение.
В design
Connection.ConnectonString := "FILE NAME=D:\XXX\Default.udl";
"Коннекция" хоть и будет активной но соединяться будет с параметрами из UDL файла
← →
Андрей Прокофьев (2002-09-17 16:29) [6]Хотя нет!
Стоит только поставить в design Active := true, как в ConnectionString записываются данные из UDL!
← →
sniknik (2002-09-17 16:40) [7]А если опять в фалсе поставить?
← →
Андрей Прокофьев (2002-09-17 16:43) [8]Тогда опять хорошо, но они как раз и забывают это сделать :)
← →
sniknik (2002-09-17 16:48) [9]да это не важно поверь. забудут будет брать из UDL ,он тебе при активном соеденении просто строку показывает для удобства а на самом деле как поставил UDL так оно и будет.
← →
Андрей Прокофьев (2002-09-17 16:57) [10]>> sniknik ©
Да!!! в DFM файле все OK!
Мы же этим пользуемся, но что-то товарищ иеня смутил.
← →
wicked (2002-09-17 19:30) [11]ужас.....
а нельзя ли всё таки потрудиться и проконтролировать, чтоб к заказчику программа шла в нужном виде?....
← →
Balu (2002-09-17 19:53) [12]Описываем метод TADOConnection.BeforeConnect.
procedure TDataModule1.ADOConnection1BeforeConnect(Sender: TObject);
begin
ADOConnection1.ConnectionString :=
"Provider=SQLOLEDB.1;Persist Security Info=False;"+
"Initial Catalog="+ BaseName +
";Data Source="+ ServerName +";Locale Identifier=1049;"+
"Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;"+
"PASSWORD="+ Password +
";User ID="+ UserName ;
end;
Что то храню в ini файлах, что то спрашиваю у клиента (тут же можно вызвать окно запроса юзвера и пароля) и подставляю.
Может быть я не прав (или делаю не эфективно), но работает.
← →
a_smith (2002-09-17 20:39) [13]К сожалению мне вариант c UDL-файлами как раз и не подходит - система при старте читает из реестра список доступных серверов и их заранее заданные характеристики соединения, далее форматируется строка соединения и делается коннект. При этом оператор при старте имеет возможность выбрать нужный в данный момент сервер.
Что же касается ужаса, то да, согласен, это ужас. Но в ситуации, когда версии вылетают мылом через час-два, избежать этого просто невозможно.
← →
wicked (2002-09-17 20:58) [14]2 a_smith
:)
кстати, для того, чтоб хоть немного уменьшить этот ужас, я поступал так: в обработчике OnCreate модуля данных формировал ConnectionString... без всяких закрытий коннекта - программа то запускается и он должен быть закрыт априорно.... тогда, если свойство Connected было установлено в true, программа просто вылетала с exception...
и чтоб этот способ сработал, надо хоть раз запустить программу перед тем, как отдавать её заказчику...
← →
sniknik (2002-09-17 21:51) [15]ладно не подходит так не подходит как тебе такая идея.
Все ADO компоненты в модуле данных а не расбросаны по формам? тогда перенеси создание модуля (и подключение в случае оплошности) из заголовка программы
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TDMod, DMod);
Application.CreateForm(TLogForm, LogForm);
Application.Run;
в событие от главной формы onShow например
procedure TMainForm.FormShow(Sender: TObject);
const once: boolean= true;
begin
if once then begin
LoadParameters(PAR_ALL);
Application.CreateForm(TDMod, DMod); //сюда к примеру
RunActive:= false;
ButtonsEnable(StartServer(true));
once:= false;
end;
end;
тогда у тебя будет время и на чтение строки и на запрос значений в случае чего и на формирование правильной с твоей точки зрения.
хотя хоть убей не понимаю почему UDL не подходит. Самый удобный вариант, пользователь сам может (по вашей подсказке) настраивать соеденение, вы можете менять программу а UDL будет старая лежать и ни каких дополнительных настроек. может ты не понимаеш возможностей? сделай пустой файл назови к примеру test.udl а после сделай двойной клик мышой на нем в проводнике.
← →
a_smith (2002-09-18 16:38) [16]Естественно, модуль данных не создается в заголовке программы, а неком классе-стартере до создания всякого другого класса. И дело здесь не в том, что нужно "время и на чтение строки и на запрос значений" (это можно делать первой строкой в DPR-файле), а в том, что при создании модуля данных вычитывается его бинарный ресурс и когда завершается создание экземпляра TADOConnection, его свойство Active := true заставляет выполнять соединение с сервером. И это, заметим, еще ДО создания модуля данных, т. е. передать какие-либо параметры ему еще нельзя.
Вариант с UDL, повторюсь, не подходит. Наши пользователи просто не станут (трудно потребовать от чиновника, например, нотариальной конторы, навыков настройки даталинки) это делать, тем более по нашей подсказке. Тем более, что между нами 7 часовых поясов и нет примого контакта. Так что единственный выход - сканировать сеть на наличие доступных серверов, давать возможность выбора оного, выводить список доступных баз на нем, выбирать требуемую и все это запоминать при завершении, дабы не делать этого при следующем запуске.
← →
sniknik (2002-09-18 17:23) [17]см
Balu © (17.09.02 19:53)
есть также у конекта также событие OnWillConnect то есть даже не до соеденения а только какое будет.
то есть масса способов подсунуть правильную строку или разорвать соеденение до попытки соеденения, токо это надо предусмотреть в програме а не кивать на BDE.
а вы батенька извиняюсь просто вые;%;:есь или сами не знаете чего хотите. ищете сложные способы чтобы оправдать собственную безалаберность.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c