Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
1-71655
Вован
2003-09-08 22:21
2003.09.22
Как узнать в обработчике TAction кем он вызван? Какой кнопкой или


1-71699
Olegka
2003-09-10 11:08
2003.09.22
Новое окно клиента


3-71487
Vadim
2003-08-31 23:01
2003.09.22
Проблема с сохранением БД


8-71772
alexus
2003-05-26 13:49
2003.09.22
Вывод растра на канвас формы


14-71865
МаХиМ
2003-09-02 18:02
2003.09.22
Как создать заставку для программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский