Форум: "Базы";
Текущий архив: 2003.09.22;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.024 c