Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как программно создать алиас в BDE ? [D6, Paradox]


Denisiy ©   (2003-12-22 15:15:00) 

Всем доброго дня.
Есть локальные таблицы, к ним хочу достучаться. Использую TDatabase, все НД завязаны на него. Ведь чтобы TDatabase подключить (т.е. поле AliasName), нужно пойти и ручками настроить в BDE ->New DB Driver Name и т.д.

Есть ли программное решение задачи?


Silver Alex   (2003-12-22 16:41:00) [1]

я вот так делаю
procedure TDA.DataBaseBeforeConnect(Sender: TObject);
begin
DB.Params.Clear;
DB.Params.LoadFromFile("wh_DB.tt");
end;

файл wh_DB.tt

PATH=C:\MainDB
DEFAULT DRIVER=PARADOX
ENABLE BCD=FALSE

вобщем что нужно, то и пишешь в файле


AbrosimovA   (2003-12-22 16:31:00) [2]

Program MyProg;

uses Forms,
Windows,
SysUtils,
Classes,
DBTables,...

var L : TStringList;
Index: integer;
Flag: boolean;

begin
Application.CreateForm(TDataModule1, DataModule1);
DataModule1.Session1.ConfigMode := cmPersistent;
L := TStringList.Create;
try
DataModule1.Session1.GetAliasNames(L);
for Index := 0 to L.Count - 1 do
if L.Strings[Index]="MyBase" then Flag:=true;
if NOT(Flag) then begin
L.Add("DEFAULT DRIVER=PARADOX");
L.Add("PATH="+ExtractFilePath(Application.Exename)+"Data");
DataModule1.Session1.AddAlias("MyBase", "STANDARD", L);
DataModule1.Session1.SaveConfigFile;
end;
finally
L.Free;
end;
end.


Sandman25   (2003-12-22 15:57:00) [3]

[17] MV (22.12.03 15:54)

Зря Вы так... Нет ничего стыдного в том, чтобы учиться. Все мы учимся друг у друга...
Все, пока.


MV   (2003-12-22 15:54:00) [4]

Clever boy.


Sandman25   (2003-12-22 15:50:00) [5]

[15] MV (22.12.03 15:44)

Кстати, я так и делаю.
Вместо TfDM.ConnectTo я вызываю ConnectTo. ConnectTo - процедура (не метод), с примерно таким кодом.

implementation

var
fDM: TfDM;

procedure ConnectTo(...);
begin
if not Assigned(fDM) then
fDM := TfDM.Create(...);
fDM.ConnectTo(...)
end;

В итоге как захочу, так и назову Datamodule. Какие компоненты захочу, такие и буду использовать... И не надо будет ничего менять.


MV   (2003-12-22 15:44:00) [6]

Ну и инкапсулируйся на здоровье. Тихо сам с собою.


Sandman25   (2003-12-22 15:43:00) [7]

[13] MV (22.12.03 15:38)

У меня у самого полно рабочих проектов :)

В TfDM нужно делать метод SetDatabaseParams (или ConnectTo) с параметрами (или одним параметром-записью) и вызывать его, откуда надо.
Нефиг лезть в переменные из другого модуля напрямую. Захочешь имя TDatabase исправить - будешь полпрограммы переделывать.

PS. И не спорь, а то дам ссылку на книги об инкапсуляции :)


MV   (2003-12-22 15:38:00) [8]

Сандман - неправ. Пример из рабочего проекта.


Sandman25   (2003-12-22 15:33:00) [9]

[11] MV (22.12.03 15:31)

Из вредности скажу, что весь этот код должен находиться в том же модуле, где объявлена fDM. И желательно в методе :)


MV   (2003-12-22 15:31:00) [10]

А вот совсем "программно":
with fDM.dbSales do begin // Здесь - fDM - модуль данных,
// а dbSales типа TDataBase
if Connected then Close;
LoginPrompt := false;
Params.Values["PASSWORD"] := Password;
Params.Values["USER NAME"] := UserName;
Params.Values["LANGDRIVER"] := "ancyrr";
Params.Values["SERVER NAME"] := WorkedFileName;
........
Open;

end


Sandman25   (2003-12-22 15:30:00) [11]

Я вообще-то перепутал. Я этот My_Temp_Alias пишу в DatabaseName. А AliasName у меня остается пустой.


MV   (2003-12-22 15:27:00) [12]

Подгородецкий прав!


MV   (2003-12-22 15:27:00) [13]

Sandman неправ!


Anatoly Podgoretsky   (2003-12-22 15:27:00) [14]

An application can specify the DatabaseName, DriverName, and Params properties rather than setting AliasName


Sandman25   (2003-12-22 15:26:00) [15]

Указать в этом поле что-нибудь типа My_Temp_Alias.


MV   (2003-12-22 15:26:00) [16]

В общем, так:
Компонент типа TDatabase размещаем на экземляре TDataModule.
Клацаем по нему 2 раза.
Указываем в Database/Name что-нибудь, например, MySuperAlias.
Поле Database/Alias оставляем пустым
Поле Database/DriverName пишем InterBase
Поле Parameters Override, например:

SERVER NAME=E:\Working\IBSales\Data\Пример.tib
USER NAME=SYSDBA
OPEN MODE=READ/WRITE
SCHEMA CACHE SIZE=8
LANGDRIVER=ancyrr
SQLQRYMODE=
SQLPASSTHRU MODE=SHARED AUTOCOMMIT
SCHEMA CACHE TIME=-1
MAX ROWS=-1
BATCH COUNT=200
ENABLE SCHEMA CACHE=FALSE
SCHEMA CACHE DIR=
ENABLE BCD=FALSE
BLOBS TO CACHE=64
BLOB SIZE=32
WAIT ON LOCKS=FALSE
COMMIT RETAIN=FALSE
ROLE NAME=
SQLDIALECT=1
PASSWORD=masterkey


Options/LoginPrompt&Keep Inactive connection оставляем пустыми.

Все. Теперь в твоих модулях делаем доступным этот TDataModule посредством Uses, а в TTable"s и TQuery"s в свойствах DataBaseName указываем ранее введенное MySuperAlias.

Все.


Denisiy   (2003-12-22 15:22:00) [17]

Да оно логически понятно, что алиас не нужен, но если в TDatabase оставить пустым поле ALiasName - то ругается "unknown database" . Как ето победить?


Sandman25   (2003-12-22 15:18:00) [18]

Использование TDatabase совершенно не требует существования алиаса.
Например, при работе с БД Paradox можно указать Database.Params.Values["PATH"] := путь к базе данных;


MV   (2003-12-22 15:16:00) [19]

Неправильно. Вернее, не обязательно.
Подожди, в старом проекте покопаюсь, гляну.


JibSkeart   (2003-12-22 15:16:00) [20]

гдето я уже видил ответ

на всякий случай в FAQ-e посмотрите :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо