C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Диалог построения строки коннекта, ADO Connection String Building
olegenty
Отправлено: 23.04.2004, 07:36


Ветеран

Группа: Модератор
Сообщений: 2412



Господа разработчики, как вызвать СТАНДАРТНЫЙ диалог построения строки коннкта для ADOConnection? Не вижу ни среди методов TADOConnection, ни среди методов TADOConnection::ConnectionObject...
Gedeon
Отправлено: 23.04.2004, 09:25


Ветеран

Группа: Модератор
Сообщений: 1742



Посоветовать могу следующее:
В Connection String прямо в инспекторе обьектов напишите:
QUOTE

File name="C:\\yourfile.udl"

Дальше, либо сначала создайте пустой файл и поменяйте его расширение на *.udl либо создавайте его в программе.
Вот таким макаром вызывается диалог
CODE

ShellExecute(Handle,"open","C:\\yourfile.udl",NULL,NULL,SW_SHOW);

После нажатия кнопки Ок в диалоге в файл сохраняется информация о выбранном подключении. При AdoConnection1->Open() он вычитает все из файла. Прелесть в том, что командную строку можно менять в любой момент и этот выбор сохраняется.
olegenty
Отправлено: 23.04.2004, 10:04


Ветеран

Группа: Модератор
Сообщений: 2412



Спасибо, попробую. Но, мне кажется, это должно быть в какой-то системной DLL-ке прописано. Знать бы в какой, и как звать функцию...
Gedeon
Отправлено: 05.05.2004, 16:15


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (olegenty @ 23/04/2004, 11:06)
Спасибо, попробую. Но, мне кажется, это должно быть в какой-то системной DLL-ке прописано. Знать бы в какой, и как звать функцию...

Имя этой dll — oledb32.dll, имя функции не знаю.
Вот таким еще макаром м. зпустить этот диалог
CODE

   Variant DL;
   DL = CreateOleObject("Datalinks");
   DL.Exec(Procedure("PromptNew"));

Тока как вытащить оттуда строку подклчения пока не могу понять надо обьектные библиотеки ковырять.
olegenty
Отправлено: 06.05.2004, 08:36


Ветеран

Группа: Модератор
Сообщений: 2412



Блин, вот мудень, сам же должен быть догадаться, что посредством OLE это должно работать. Там надо только имя Property знать и посредством OlePropertyGet его успешно вытягивать.

А сейчас предложенный тобой первый вариант работает. И замечательно работает, надо сказать smile.gif
olegenty
Отправлено: 30.05.2004, 08:28


Ветеран

Группа: Модератор
Сообщений: 2412



Короче добил я вопрос.
Есть варианты (в примере "с" — это TADOConnection*).
1 (посложнее) — импортировать библиотеку типа и работать с импортированной оболочкой, которая зовётся TDataLinks. тогда это будет так:

CODE

   TDataLinks *dl = new TDataLinks(Application);
   dl->Connect();
   IDispatch *d = c->ConnectionObject;
   dl->PromptEdit(&d);
   dl->Disconnect();
   delete dl;


2 (попроще)
CODE

  Variant DL = CreateOleObject("Datalinks");
  DL.OleProcedure("PromptEdit", c->ConnectionObject);
  DL.Clear();



P.S. В случае 1 екзешник примерно на полметра больше получается, а вот случай 2 — рулит

P.P.S. А из PromptNew вытянуть строку никак, PromptNew возвращает IDispatch* объекта _ConnectionPtr... т.е. там строку из объекта надо вытягивать. я подумал-подумал, да и решил, что мне не пригодится. принудительно менять ConnectionObject у TADOConnection не вижу смысла
_vadim_
Отправлено: 30.05.2004, 17:17


Ученик-кочегар

Группа: Участник
Сообщений: 18



В составе C++Builder 5 имеется недокументированная функция
PromptDataSource(), которая позволяет вводить строку подключения.
Обьявление этой функции находится в файле ADODB.hpp:

WideString PromptDataSource
(int theWindowHandle, WideString theOriginalConnectionString);

Эта функция выводит на экран диалоговое окно, в котором пользователь может сформировать строку подключения или отредактировать ту, которая передана параметром theOriginalConnectionString. Это такое же диалоговое окно, как и то, что выводится на экран при редактировании значения свойства ConnectionString в процессе разработки программы.

Удачи. wink.gif
olegenty
Отправлено: 31.05.2004, 06:44


Ветеран

Группа: Модератор
Сообщений: 2412



ха-ха biggrin.gif зато мы с Gedeon'ом изобрели велосипед.
спасибо. где ж ты раньше был, друг любезный? biggrin.gif
olegenty
Отправлено: 31.05.2004, 06:59


Ветеран

Группа: Модератор
Сообщений: 2412



вот и текст функции:
CODE

function PromptDataSource(ParentHandle: THandle; InitialString: WideString): WideString;
var
 DataInit: IDataInitialize;
 DBPrompt: IDBPromptInitialize;
 DataSource: IUnknown;
 InitStr: PWideChar;
begin
 Result := InitialString;
 DataInit := CreateComObject(CLSID_DataLinks) as IDataInitialize;
 if InitialString <> '' then
   DataInit.GetDataSource(nil, CLSCTX_INPROC_SERVER,
     PWideChar(InitialString), IUnknown, DataSource);
 DBPrompt := CreateComObject(CLSID_DataLinks) as IDBPromptInitialize;
 if Succeeded(DBPrompt.PromptDataSource(nil, ParentHandle,
   DBPROMPTOPTIONS_PROPERTYSHEET, 0, nil, nil, IUnknown, DataSource)) then
 begin
   InitStr := nil;
   DataInit.GetInitializationString(DataSource, True, InitStr);
   Result := InitStr;
 end;
end;
Gedeon
Отправлено: 01.06.2004, 08:53


Ветеран

Группа: Модератор
Сообщений: 1742



И в 6 есть эта функция.

QUOTE (olegenty @ 31/05/2004, 07:46)
ха-ха  biggrin.gif зато мы с Gedeon'ом изобрели велосипед.
спасибо. где ж ты раньше был, друг любезный?  biggrin.gif

Изобретение таких велосипедов считаю полезным.

Лучше всего знать несколько способов решения одной проблемы. biggrin.gif
olegenty
Отправлено: 01.06.2004, 09:20


Ветеран

Группа: Модератор
Сообщений: 2412



естественно полезно, вопросов нет smile.gif

Вернуться в Работа с базами данных в C++Builder