Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Проблема с подключением ADOConnection


Автор: User 5.3.2005, 09:53
Я сохраняю путь к БД в реестре. Использую БД Access. Затем запускаю свою программу. При этом хочется что бы ADOConnection1 прочитала путь и соответственно запустилась прога и подключилась БД. Написал следующее: (извените что не использую стеки не как не пойму как это делать)

program Organaizer;

uses
Forms,
Registry, // Инициализирую работу с реестром
ADOConEd, // Инициализирую работу c ADOConnection
Main in 'Main.pas' {MainForm},
Unit1 in 'Unit1.pas' {DM: TDataModule},
SNP_Form in 'SNP_Form.pas' {SNP},
SNP_Parametr_Form in 'SNP_Parametr_Form.pas' {SNP_Parametr},
SNP_Edit_Form in 'SNP_Edit_Form.pas' {SNP_Edit},
SNP_Find_Form in 'SNP_Find_Form.pas' {Find_Form},
Telefon_Insert_Form in 'Telefon_Insert_Form.pas' {Telefon_Insert},
Komment_Form in 'Komment_Form.pas' {Komenntar},
Telefon_Edit_Form in 'Telefon_Edit_Form.pas' {Telefon_Edit};

{$R *.res}

var
FIniFile : TRegIniFile;
S : String;
begin
FIniFile :=TRegIniFile.Create('Software'); // Инициализация реестра
FIniFile.OpenKey('ORGANAZER', true); // Открываю раздел 1
FIniFile.OpenKey('Options', true); // Открываю раздел 2
S := FIniFile.ReadString('Options_Param', 'Param2', ''); // Загружаю из реестра значения
FIniFile.Free;
DM.ADOConnection1.Close;
if EditConnectionString(DM.ADOConnection1) then
begin
DM.ADOConnection1.Connected := True;
DM.ADOTable1.Active := True;
DM.ADOTable2.Active := True;
DM.ADOTable3.Active := True;
DM.ADOTable4.Active := True;
end;
DM.ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;' + 'DataSource=' + S + ';PersistSecurity Info=false';
DM.ADOConnection1.Open;
DM.ADOConnection1.Connected :=True;

end;

begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TDM, DM);
Application.CreateForm(TSNP, SNP);
Application.CreateForm(TSNP_Parametr, SNP_Parametr);
Application.CreateForm(TSNP_Edit, SNP_Edit);
Application.CreateForm(TFind_Form, Find_Form);
Application.CreateForm(TTelefon_Insert, Telefon_Insert);
Application.CreateForm(TKomenntar, Komenntar);
Application.CreateForm(TTelefon_Edit, Telefon_Edit);
Application.Run;
end.



Пробывал использовать второй вариант:

var
FIniFile : TRegIniFile;
S : String;
begin
FIniFile :=TRegIniFile.Create('Software'); // Инициализация реестра
FIniFile.OpenKey('ORGANAZER', true); // Открываю раздел 1
FIniFile.OpenKey('Options', true); // Открываю раздел 2
S := FIniFile.ReadString('Options_Param', 'Param2', ''); // Загружаю из реестра значения
DM.ADOConnection1.Close;
DM.ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;' + 'DataSource=' + S + ';PersistSecurity Info=false';
DM.ADOConnection1.Open;
DM.ADOTable1.Active := True
DM.ADOTable2.Active := True;
DM.ADOTable3.Active := True;
DM.ADOTable4.Active := True;
FIniFile.Free;
end;

Но в том и другом случае дельфи (при компиляции) говорит что ошибок нет, а при запуске выдает ошибку на невозможность подключения (и аксцеш виалейшен). Как быть? Я прямо растерялся.....

Автор: Zero 5.3.2005, 12:10
У меня такаяже проблема, но не динамически подключится получается
http://forum.vingrad.ru/index.php?showtopic=43165&st=15
Цитата(User @ 5.3.2005, 09:53)
извените что не использую стеки не как не пойму как это делать

Там где ты вводиш сообщение для отправки, в панели инструментов, есть открывающийся список, с названием Код, щёлкни справа на стрелку, и выбери например Delphi, появятся где ты вводишь сообщение вот такие штуки
[cоde=delphi]

[/code]
А внутри в пустой строке пиши свой текст программы

Автор: Петрович 5.3.2005, 12:11
Доступ к DM и ко всем лежащим не нем компонентам возможен только после Application.CreateForm(TDM, DM);. Т.к. до этого, экземпляр DM еще не создан.

Я например делаю это так (упрощенно):

Код

procedure Tdm.ADOConnectionBeforeConnect(Sender: TObject);
begin
 Abort;  // для того что-бы избежать попытку соединения с БД настроенной во время дизайна, при загрузке формы из ресурса  
end;

procedure Tdm.DataModuleCreate(Sender: TObject);
begin
 try
   // Открыть БД:
   with  ADOConnection  do begin
     BeforeConnect := Nil; // отключение ADOConnectionBeforeConnect.
     ConnectionString := ... строка соединения ...;
     Open;
   end;

   // Открыть датасеты
   ... открытие связанных с ADOConnection наборов данных ...
 except
   ... обработка ошибок ...
 end;
end;


Автор: User 5.3.2005, 13:36
Все получилось. Требовалось просто подумать. Привожу полученный код.

program Project1;

uses
Forms,
Registry,
ADOConEd,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
FIniFile : TRegIniFile;
S : String;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);

begin
FIniFile :=TRegIniFile.Create('Software'); // Инициализация реестра
FIniFile.OpenKey('ORGANAZER', true); // Открываю раздел 1
FIniFile.OpenKey('Options', true); // Открываю раздел 2
S := FIniFile.ReadString('Options_Param', 'Param2', ''); // Загружаю из реестра значения
FIniFile.Free;
Form1.ADOConnection1.Close;
Form1.ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + S + ';Persist Security Info=false';
Form1.ADOConnection1.Open;
Form1.ADOTable1.Active := True;

Application.Run;
end;
end.

Автор: Anakin 26.3.2007, 16:18
Всем Привет.
Я знаю что эта тема не поднималась уже 2 года ) но я решил использовать данный пример который дал Петрович
Прога компелируетса норм но при запуске выдаёт ошибку с таким текстом "невозможно найти устанавливаемый ISAM"
КТо знает чем вызванна данная ошибка??
Или кто знает каким ещё можно способом соеденить DataModule без указания прямого пути.

Автор: malor 4.6.2007, 15:41
Настраиваю ADOConnection для работы с таблицей Paradox. После нажатия на кнопке Build... какого поставщика данных нужно выбирать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)