Как проверить, есть ли подключение к БД при запуске приложения?

Проверять при крите главной формы, разумеется нельзя, т.к. datamodule запускается первым, иначе будет Access Volation... Т.е. получается нужно проверять было ли соединение с базой в крите DataModule ? Так и делаю. Если нет соединения, тогда мне нужно открыть опендиалог и выбрать где же находится нужная база данных. Но трабл в том, что опендиалога нету в datamodule, т.к. он используется для доступа к данным и только. Замкнутый круг У кого какие идеи, кто что подскажет?
14 ответов

Не используйте DataModule. Просто разместите нужные компоненты на форме, включая OpenDialog и в обработчике формы OnCreate проверяйте


droider, да я бы с радостью, но уже весь проект написан с его использованием. И перелопачивать весь код - не успею.


Или можно сделать так при использовании DataModule
procedure DBModule.DataModuleCreate(Sender: TObject);
    const
      Full_path = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
    var
      Base_path: string;
    begin
      Base_path := ExtractFilePath(ParamStr(0))+'DB.mdb'; //база в каталоге с программой
     
        With ADOConnection1 do
         Begin
            Close;
            try
              ConnectionString:= Format(Full_path, [Base_path]);
              Open;
             except
              ShowMessage('Ошибка подключения !');
              Exit;
            end;
         if Form1.OpenDialog1.Execute then
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;DataSource='+OpenDialog1.FileName + ';Persist Security Info=False';
      ADOConnection1.Connected := true;   
                    End;
            end;
Form1 - это имя формы, на которой расположен компонент OpenDialog


if Form1.OpenDialog1.Execute then
ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data  Source='+OpenDialog1.FileName + ';Persist Security Info=False'
ADOConnection1.Connected := true;
Ок. Далее включать каждый Tquery в истину? Ибо при установке коннекта в истину, все Tquery скинутся в фолс...
Form1 - это имя формы, на которой расположен компонент OpenDialog
это можно было не писать и так ясно.


Лучше так
procedure DBModule.DataModuleCreate(Sender: TObject);
    const
      Full_path = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
    var
      Base_path: string;
    begin
      Base_path :='твой путь к базе';
     
        With ADOConnection1 do
         Begin
            Close;
            try
              ConnectionString:= Format(Full_path, [Base_path]);
              Open;
             except
              ShowMessage('Ошибка подключения !');
              Exit;
            end;
         if Form1.OpenDialog1.Execute then
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;DataSource='+OpenDialog1.FileName + ';Persist Security Info=False';
      ADOConnection1.Connected := true;   
             end;
            end;
Далее включать каждый Tquery в истину?
Активируй Query при выполнении запроса в программеУ тебя данные при подключении к базе сразу выводятся по запросу?


try
 ConnectionString:= Format(Full_path, [Base_path]);
 Open;
except
 ShowMessage('Ошибка подключения !');
 Exit;
 end;
Зачем отлавливать ошибку, если можно проверить свойство connected у ADOConnection, если не подключено, тогда и вывести опендиалог., иначе условие не выполняется и все.?хмм... мб это для того, чтобы небыло вывода системной ошибки, что бд не найдена?
У тебя данные при подключении к базе сразу выводятся по запросу?
Да, т.е. выборку прописал в свойстве sql, а далее поставил active := true и вывожу через datasource в Dbgrid


Зачем отлавливать ошибку?
если базы не будет по пути, указанном по умолчанию, то будет выдана ошибка. После уже выбираешь файл базы через окно диалогаЕсли данные после подключения к базе сразу выводятся запросом, то да, активируй один Query с твоим запросом, но не все сразу


если базы не будет по пути, указанном по умолчанию, то будет выдана ошибка. После уже выбираешь файл базы через окно диалога сразу
хмм... мб это для того, чтобы небыло вывода системной ошибки, что бд не найдена?
Значит правильно понял. Еще на вопрос по дельфи ответить сможете?
но не все сразу
а надо, все. Иначе те которые не активировал, не будут выдавать записи в необходимые мне гриды (а их много).
if Form1.OpenDialog1.Execute then
ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data *Source='+OpenDialog1.FileName + ';Persist Security Info=False'
ADOConnection1.Connected := true;
Фишка бы прокатила, если Form1 была бы запущена перед datamodule. Но у меня сначала datamodule, а потом уже все остальное.Access Violation ... Собственно, все верно, т.к. достать из не созданного Form1 диалог никак не получится(сначала DataModule). Как быть?


Лучше так
Вопрос, если у меня например
const
  Full_path =
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False';
var
  Base_path: string;
begin
  Base_path := 'BD\1.mdb';
  With ADOConnection1 do
  Begin
    Close;
    try
      ConnectionString := Format(Full_path, [Base_path]);
      Open;
    except
      ShowMessage('Ошибка подключения !');
      Exit;
    end;
  End;
end;
в коде будет другое имя бд или путь прописан, что программа не сможет найти БД. То у меня должно появится на экране сообщение 'Ошибка подключения !' ?


То у меня должно появится на экране сообщение 'Ошибка подключения !' ?
у тебя при ЛЮБОЙ ошибке на Open появится сообщение 'Ошибка подключения !'


Концепция изначально неверная. На кой бес в датамодуль помещать открытие базы данных? Датамодуль сделан только для удобного размещения в одном месте компонент доступа к БД. Если процесс подключения к БД у вас затянется или завершится неудачей вы же выдадите пользователю оконное сообщение об ошибке, т.е. придется подключать те самые визуальные компоненты, которых в датамодуле нет, зато есть в форме. Кроме того наличие диалога выбора БД предполагает некий минимальный визульный интерфейс вызова этого самого диалога.


У кого какие идеи, кто что подскажет?
на создании главной форму руками создать query и connection, прописать им настройки и попробовать подключиться к БД


ух сколько советов а концептуально не пробовали подходить? с т.з. правильности кода, разделения логики и прочей муры изначально никогда ничего не должно быть подключенопри старте программы обычно считываются настройки, в т.ч. и настройки подключения к БД эти настройки передаются методу, который пытается подключиться. результаты используются там, где этот метод был вызвана открытие датасетов уж тем более нужно проводить отдельно, в другом методе, потому что нужно открывать то что нужно именно в данный момент, а не все подряд, как это любят созидатели форм1 форм2 ... форм74так что в datamodule.OnCreate нечего делать процедуре подключения скорее всего там вообще нечего делатьпримерный разбор старта программы я описывал тут http://www.cyberforum.ru/blogs/469693/blog4884.html


А не проще ли проверить подключение не при создании формы, а при её показе? OnShow как бы есть.