Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/68: Рейтинг темы: голосов - 68, средняя оценка - 4.59
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
1

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

10.11.2012, 14:22. Показов 12300. Ответов 17
Метки нет (Все метки)

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

У кого какие идеи, кто что подскажет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2012, 14:22
Ответы с готовыми решениями:

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

Лаги при запуске игр, если есть подключение к Интернет. Ноутбук
Помогите, очень тормозит запуск винды, проверял на Soluto вышло почти 3 минуты. Это жестоко. Ниже...

Как проверить есть ли подключение к интернету?
???

Как сделать при запуске приложения выделенный текст(как на фото), при нажатии кнопки как на фото2

17
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
10.11.2012, 14:37 2
Не используйте DataModule. Просто разместите нужные компоненты на форме, включая OpenDialog и в обработчике формы OnCreate проверяйте
0
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
10.11.2012, 15:14  [ТС] 3
droider, да я бы с радостью, но уже весь проект написан с его использованием. И перелопачивать весь код - не успею.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
10.11.2012, 15:20 4
Или можно сделать так при использовании DataModule
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
Добавлено через 2 минуты
Form1 - это имя формы, на которой расположен компонент OpenDialog
1
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
10.11.2012, 15:22  [ТС] 5
Цитата Сообщение от droider Посмотреть сообщение
Delphi
1
2
3
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 скинутся в фолс...

Добавлено через 34 секунды
Цитата Сообщение от droider Посмотреть сообщение
Form1 - это имя формы, на которой расположен компонент OpenDialog
это можно было не писать и так ясно.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
10.11.2012, 15:31 6
Лучше так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
Добавлено через 1 минуту
Далее включать каждый Tquery в истину?
Активируй Query при выполнении запроса в программе

Добавлено через 2 минуты
У тебя данные при подключении к базе сразу выводятся по запросу?
1
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
10.11.2012, 15:34  [ТС] 7
Цитата Сообщение от droider Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
try
 ConnectionString:= Format(Full_path, [Base_path]);
 Open;
except
 ShowMessage('Ошибка подключения !');
 Exit;
 end;
Зачем отлавливать ошибку, если можно проверить свойство connected у ADOConnection, если не подключено, тогда и вывести опендиалог., иначе условие не выполняется и все.?

хмм... мб это для того, чтобы небыло вывода системной ошибки, что бд не найдена?

Добавлено через 1 минуту
Цитата Сообщение от droider Посмотреть сообщение
У тебя данные при подключении к базе сразу выводятся по запросу?
Да, т.е. выборку прописал в свойстве sql, а далее поставил active := true и вывожу через datasource в Dbgrid
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
10.11.2012, 15:44 8
Зачем отлавливать ошибку?
если базы не будет по пути, указанном по умолчанию, то будет выдана ошибка. После уже выбираешь файл базы через окно диалога

Добавлено через 2 минуты
Если данные после подключения к базе сразу выводятся запросом, то да, активируй один Query с твоим запросом, но не все сразу
0
18 / 15 / 0
Регистрация: 25.10.2011
Сообщений: 241
10.11.2012, 19:13  [ТС] 9
Цитата Сообщение от droider Посмотреть сообщение
если базы не будет по пути, указанном по умолчанию, то будет выдана ошибка. После уже выбираешь файл базы через окно диалога
сразу
Цитата Сообщение от stupidstudent Посмотреть сообщение
хмм... мб это для того, чтобы небыло вывода системной ошибки, что бд не найдена?
Значит правильно понял.
Еще на вопрос по дельфи ответить сможете?

Добавлено через 2 минуты
Цитата Сообщение от droider Посмотреть сообщение
но не все сразу
а надо, все. Иначе те которые не активировал, не будут выдавать записи в необходимые мне гриды (а их много).

Добавлено через 3 часа 23 минуты
Цитата Сообщение от stupidstudent Посмотреть сообщение
Delphi
1
2
3
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).
Как быть?
0
0 / 0 / 0
Регистрация: 19.01.2018
Сообщений: 162
23.01.2018, 22:33 10
Цитата Сообщение от droider Посмотреть сообщение
Лучше так
Вопрос, если у меня например
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
в коде будет другое имя бд или путь прописан, что программа не сможет найти БД. То у меня должно появится на экране сообщение 'Ошибка подключения !' ?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
24.01.2018, 00:10 11
Цитата Сообщение от elimpion Посмотреть сообщение
То у меня должно появится на экране сообщение 'Ошибка подключения !' ?
у тебя при ЛЮБОЙ ошибке на Open появится сообщение 'Ошибка подключения !'
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,376
26.01.2018, 00:13 12
Концепция изначально неверная. На кой бес в датамодуль помещать открытие базы данных? Датамодуль сделан только для удобного размещения в одном месте компонент доступа к БД. Если процесс подключения к БД у вас затянется или завершится неудачей вы же выдадите пользователю оконное сообщение об ошибке, т.е. придется подключать те самые визуальные компоненты, которых в датамодуле нет, зато есть в форме. Кроме того наличие диалога выбора БД предполагает некий минимальный визульный интерфейс вызова этого самого диалога.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,130
Записей в блоге: 3
26.01.2018, 07:16 13
Цитата Сообщение от stupidstudent Посмотреть сообщение
У кого какие идеи, кто что подскажет?
на создании главной форму руками создать query и connection, прописать им настройки и попробовать подключиться к БД
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
26.01.2018, 09:31 14
ух сколько советов
а концептуально не пробовали подходить? с т.з. правильности кода, разделения логики и прочей муры
изначально никогда ничего не должно быть подключено

при старте программы обычно считываются настройки, в т.ч. и настройки подключения к БД
эти настройки передаются методу, который пытается подключиться.
результаты используются там, где этот метод был вызван

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

так что в datamodule.OnCreate нечего делать процедуре подключения
скорее всего там вообще нечего делать

примерный разбор старта программы я описывал тут
https://www.cyberforum.ru/blog... g4884.html
0
10 / 12 / 2
Регистрация: 01.09.2015
Сообщений: 105
26.01.2018, 17:52 15
А не проще ли проверить подключение не при создании формы, а при её показе? OnShow как бы есть.
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,376
26.01.2018, 18:51 16
А не проще ли проверить подключение не при создании формы, а при её показе? OnShow как бы есть.
В многомодульном приложении так обычно и делают, но если у вас единое приложение, то необходимости параноидальной проверки при каждом открытии формы нет.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,554
26.01.2018, 23:10 17
Цитата Сообщение от MajentoDL Посмотреть сообщение
а при её показе? OnShow как бы есть.
Да проще . Я например
1) Все параметров сохранил в .ini файле
2) создал метод - процедур
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TfrmMain.ConnBD;
 var
    DBuser, DBPass, DBServer, DBBase : string;
begin
  try
   try
    Ini := TiniFile.Create('C:\Windows\BaseConnesct.ini');  // BaseConnesct.ini
    DM.conBD.Connected := false;
    //-------Присваиваем
     DBuser  := Ini.ReadString('UserName','Users', '' );
     DBPass := Ini.ReadString('Paswword','Pass', '');
     DBServer := Ini.ReadString('Server','Server', '');
     DBBase := Ini.ReadString('Database','Database', '');
 
    //------------ расшифровывает параметр который в .ini
    DBuser:= iddecoderxxe1.DecodeString(DBuser, TEncoding.UTF8);
    DBPass:= iddecoderxxe1.DecodeString(DBPass, TEncoding.UTF8);
    DBServer:= iddecoderxxe1.DecodeString(DBServer, TEncoding.UTF8);
    DBBase:= iddecoderxxe1.DecodeString(DBBase, TEncoding.UTF8);
 
    //-----------Передаём расшифрованный значения
    DM.conBD.Username := Ini.ReadString('','',DBuser);
    DM.conBD.Password := Ini.ReadString('','', DBPass);
    DM.conBD.Server := Ini.ReadString('','', DBServer);
    DM.conBD.Database := Ini.ReadString('','', DBBase);
    DM.conBD.Port := Ini.ReadInteger('','', 1433);
    DM.conBD.Connected := true;
    DM.msqryUsers.Open;
    except
      MessageDlg('Ошибка.! невозможно подключиться к серверу',mtError,[mbOK],0);
      Application.Terminate;
    end;
  finally
    ini.Free;
  end;
end;
3) и это процедуру вызываю из
Delphi
1
procedure TfrmMain.FormShow(Sender: TObject);
и кто скажет что неправильно ?! Буду внимательно слушать любую критику.!
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
27.01.2018, 18:35 18
Цитата Сообщение от krapotkin Посмотреть сообщение
так что в datamodule.OnCreate нечего делать процедуре подключения
Согласен. Именно поэтому я писал ТС-у аж 6 лет назад
Цитата Сообщение от droider Посмотреть сообщение
Не используйте DataModule. Просто разместите нужные компоненты на форме, включая OpenDialog и в обработчике формы OnCreate проверяйте
0
27.01.2018, 18:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2018, 18:35
Помогаю со студенческими работами здесь

Как проверить, есть ли у приложения доступ в ту или иную папку?
Допустим, есть TOpenDialog для сохранения или открытия файла. Возможны такие варианты...

Как реализовать заставку приложения при её запуске?
Здравствуйте, ув.читатели данного вопроса! Был бы очень рад, если бы вы мне могли помочь со...

Как отключить клавиатуру при запуске приложения
А как отключить только клавиатуру. Т.е при запуске программы клавиатура должна полностью отключиться

Как включить GPS при запуске приложения?
Как включить GPS (ну если он отключен) при запуске приложения, без подтверждения (но с уведомлением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru