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

Вниз

ADOConnection и UDL - ошибка открытия, если сначала прочитать...   Найти похожие ветки 

 
analyser   (2003-08-28 10:25) [0]

Собственно сабж.

На форме ADOConnection1, у которого в свойстве ConnectionString установлена ссылка на файл UDL.

Если перед ADOConnection1.Open прочитать какое-нибудь из его свойств, напр.:

ShowMessage(ADOConnection1.Properties.Item["Data Source"].Value);
ADOConnection1.Open;

то строка с Open вызовет ошибку: "Supplied provider is different from the one already in use".

Если ConnectionString в DesignTime формировался "честно", а не через UDL, то ничего подобного не происходит...

М.б. кто знает, как побороть? Необходимо, используя UDL, перед Open иметь возм-ть поменять какие-либо Propeties...


 
analyser   (2003-08-29 09:29) [1]

Прошу прощения за назойливость...
М.б. я как-то не так написал, или это никому не интересно, или еще что...
Киньте хоть пару слов, кто представляет, о чем речь, pls.

Sorry за то, что вклиниваюсь в оживленные обсуждения типа "как скакнуть на запись в гриде" и т.п.


 
jocko ©   (2003-08-29 09:47) [2]

procedure TdmMainConnection.cnnMain WillConnect(Connection: TADOConnection;
var ConnectionString, UserID, Password: WideString;
var ConnectOptions: TConnectOption; var EventStatus: TEventStatus);
var s : string;
i : integer;
s1 : string;
begin
if (EventStatus = esOK) then
begin
//проверка наличия UDL файла (если его нет предл. создать)
if ( fUDLName <>"" )and
( not FileExists(GetCurrentDir + "\" + fUDLName) ) then _ResetUDLFile; //это моя процедура
//теперь коннектимся
ConnectionString := "FILE NAME=" + GetCurrentDir + "\" + fUDLName;
UserID := fUserID;
Password := fPassword;
Connection.DefaultDatabase := fDatabase;
end
else MessageDlg( "Не удается определить наличие сервера, соединение установить не удалось!", mtWarning, [mbOK], 0);
end;
// ЗЫ выдернул кусок из своего кода, но кажется здесь все понятно


 
analyser   (2003-08-29 11:36) [3]

>jocko:
Я, собственно, о другом!
Мне необходимо прочитать из UDL (точнее, из ADOConnection, у к-рого в качестве ConnectionString определен файл UDL) те значения, к-рые там хранятся, и, при необходимости, их изменить.

Все это перекрасно работает, когда ConnectionString задается в DesignTime, и приводит к ошибке в случае, когда используется UDL.
Вот и вопрос...


 
jocko ©   (2003-08-29 11:58) [4]

Насколько я понимаю можно преобразовать udl в строку - как сделать есть в книжке "ADO в Delphi" Федоров, Елманова. перебивать оттуда код :-(
Однако, проку от всего этого будет мало, поскольку изменение ConnectionString будет выдавать указанную тобой ошибку.
Поэтому, лучше воспользоваться ф-й PromptDataSource или посмотреть как она устроена.
Вообще, в ADODB есть еще 6 :-) ф-й посмотри, может что пригодится.
Я, например, предлагаю заполнять в UDL только провайдера и имя сервера остальное подставляю в приведенном выше примере в момент конннекции, кстати, это место помоему единтвенное где это можно сделать.

Возможно у когото есть еще варианты, было бы интересно выслушать


 
analyser   (2003-08-29 13:49) [5]

>jocko © (29.08.03 11:58) [4]:

И имя сервера, и имя БД можно менять в любом месте (при закрытом коннекте, есс-но) через Propeties, напр.:

ADOConnection1.Item["Data Source"].Value := Edit1.Text;

НО! Опять повторюсь: если первоначальная ConnectionString сформирована "руками", а не через UDL.

И именно это непонятно.

Я думал, что хоть кто-нибудь об этом что-нибудь знает :((

PS: А вот как раз приведенным Вами кодом вряд ли можно изменить имя БД, если оно прописано в ConnectionString (или в UDL)!

PPS: Насчет Федоров, Елманова: книги этой у меня нет. Можно хоть в двух словах - о чем речь: "преобразовать udl в строку" ???


 
sniknik ©   (2003-08-29 14:10) [6]

у меня есть такая книга, но чегото я там ничего подобного не видел (плохо искал?) но вообше меня в ней не это интересовало а RDS и примеры по нему (кстати с ошибками в книге по нему)
а разбор udl я так делал когда нужно было (возможно не оптимально, но как есть, можеш попробовать)

function RealConnString(St: string): string;
var F: Text;
function CopyString(St: string): string;
var i: integer;
begin
result:= "";
for i:= 1 to length(St) do
if St[i] <> #0 then result:= result + St[i];
//StringReplace()
end;
begin
St:= Trim(St);
if Pos("FILE NAME", UpperCase(St)) = 1 then begin
AssignFile(F, Copy(St, 11, Length(St)));
Reset(F);
while (not eof(F)) and (not (UpperCase(Copy(St,1,8)) = "PROVIDER")) do begin
Readln(F, St);
St:= Trim(CopyString(St));
end;
if UpperCase(Copy(St,1,8)) <> "PROVIDER" then result:= ""
else result:= St;
CloseFile(F);
end else result:= St;
end;

вызов (можеш перед открытием и изменениями у себя поставить, должно получится)
ADOConnection1.ConnectionString:= RealConnString(ADOConnection1.ConnectionString);


 
analyser   (2003-08-29 15:20) [7]

>sniknik © (29.08.03 14:10) [6]:

Уфф, кажется, извратился (спасибо за идею), хотя выглядит безобразно!
Значит так:
- в DesignTime у ADOConnection вообще не указываем никакую ConnectionString (пусто там!)
В RunTime:
- зная имя UDL файла, извлекаем из него RealConnString (sniknik ©),
- подставляем это извлеченное значение в ConnectionString для нашего ADOConnection,
- а вот теперь можно перед открытием ADOConnection читать и менять требуемые Properties.Items !!!

Вот ведь бред какой...


 
sniknik ©   (2003-08-29 15:40) [8]

> - в DesignTime у ADOConnection вообще не указываем никакую ConnectionString (пусто там!)
а так что не получается?
> ADOConnection1.ConnectionString:= RealConnString(ADOConnection1.ConnectionString);
при старте программы, и пусть оно там в "в DesignTime" прописано будет. главное не активно, а то выключать.../включать....


 
analyser   (2003-08-29 16:10) [9]

>sniknik © (29.08.03 15:40) [8]

Кто-то из нас чего-то не понял!

Весь смысл этой бодяги в том, что соединение должно брать параметры из UDL, но с возможностью менять их.
Если файл UDL прописать в Designtime, то... см.выше.
(В уме держим возможность того, что местонахождение этого файла может меняться и браться, напр. из .INI/OpenDialog)
...
Или я не понял:

"> ADOConnection1.ConnectionString:= RealConnString(ADOConnection1.ConnectionString);
при старте программы, и пусть оно там в "в DesignTime" прописано будет" ???


 
sniknik ©   (2003-08-29 16:23) [10]

> "> ADOConnection1.ConnectionString:= RealConnString(ADOConnection1.ConnectionString);
> при старте программы, и пусть оно там в "в DesignTime" прописано будет" ???
если там строка (в DesignTime прописана) то она и останется если udl файл то заменится на строку из него. (ну должно быть так по идее)


 
sniknik ©   (2003-08-29 16:30) [11]

а понятно..., решил попробовать. действительно не получается. надо же.


 
sniknik ©   (2003-08-29 16:48) [12]

хотя нет, еще немного поэксперементировал, прекрасно работает
ADOConnection1.ConnectionString:= RealConnString(ADOConnection1.ConnectionString);
ShowMessage(ADOConnection1.Properties.Item["Data Source"].Value);
ADOConnection1.Open;
ошибки как в вопросе нет. udl прописан в десигн тайме FILE NAME=D:\Base.udl действие (up) по кнопке.

а вот почему без переопределения строки ошибка действительно непонятно.



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

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

Наверх




Память: 0.5 MB
Время: 0.038 c
1-71680
drakulita
2003-09-11 12:27
2003.09.22
Как заархевировать файлы?


8-71759
LOX
2003-05-25 11:23
2003.09.22
Звуковое сопровождение


3-71536
a_andru
2003-08-24 19:44
2003.09.22
Oracle: Получение значений из запроса...


1-71633
NET
2003-09-09 07:32
2003.09.22
Компиляция


1-71753
Virgo
2003-09-10 11:24
2003.09.22
Как обработать нажатие клавиш перемещения вправо, влево