Как проверить ADOConnection ConnectionString перед подключением к базе данных SQL Server в Delphi 10.2

Я работаю над приложением на Delphi 10.2, и оно подключается к базе данных SQL Server 2014. Что я могу сделать, чтобы проверить соединение с базой данных, имеющей строку подключения, до запуска приложения?

Я использовал ADoconnection в качестве интерфейса для подключения к вышеупомянутой базе данных, выполнил некоторое кодирование с помощью try-catch или try-except, чтобы исключить нежелательные ошибки SQL Server, и использовал полосу индикатора, чтобы указать продвижение моей процедуры запуска (которая прогрессирует с активацией запроса и созданием формы).

Поэтому, когда строка подключения не подходит, я получаю сообщение об ошибке

Ошибка входа для пользователя 'admin98'

(admin98 — имя пользователя SQL Server); и когда со строкой подключения все в порядке, полоса датчика прогрессирует, и на полпути у меня снова та же ошибка.

ПРИМЕЧАНИЕ. Я использовал freeInstance или NewInstance или что-то подобное, но это не сработало.

Это функция, которая подключается к базе данных и перехватывает ошибки, если встречается

function DBConnect: Boolean;
var
 conStr : string;
begin
 conStr:= 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=admin'+Fstart_.year_combobox.Text+';PassWord=000;Initial Catalog=student'+Fstart_.year_combobox.Text+';Data Source='+Fstart_.StringTemp+';';
 DataModule1.ADOConnection1.Close;
 DataModule1.ADOConnection1.ConnectionString:= conStr;
 DataModule1.ADOConnection1.LoginPrompt:= False;
 if (NOT DataModule1.ADOConnection1.Connected) then
  begin
   try
    DataModule1.ADOConnection1.Open;
    Result:= True;
   Except on E:Exception do
    begin
    if e.Message = 'Login failed for user '+chr(39)+'admin'+Fstart_.year_combobox.Text+chr(39) then
     //showmessage
    if e.Message = '[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied' then
     //showmessage
     DataModule1.ADOConnection1.Close;
     DataModule1.ADOConnection1.ConnectionString:= '';
     Result:= False;
    end;
   end;
  end;
end;

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

Я ожидаю успешного подключения, но снова получаю сообщение об ошибке, даже когда я изменяю значение поля со списком, и я знаю, что пользователь существует в SQL Server


person Atrin Noori    schedule 31.03.2019    source источник
comment
Что может работать в этих обстоятельствах, так это запуск фонового потока, который пытается подключиться к серверу каждые несколько секунд. Если недавно несколько раз подряд произошел сбой, вы можете уведомить пользователя, прежде чем пытаться подключиться с помощью вашего ADOConnection1.   -  person MartynA    schedule 31.03.2019
comment
@MartynA Спасибо за ответ, но многопоточность для меня сейчас слишком сложна, и, основываясь на других частях приложения, у меня позже возникнет много проблем.   -  person Atrin Noori    schedule 01.04.2019
comment
Читая это снова и снова, я с трудом понимаю ваш вопрос. Вы упоминаете сообщения об ошибках, которых не может быть из этого кода, потому что он поглощает все. Вы упоминаете NewInstance и FreeInstance, которые вам все равно не следует вызывать, но которых нет в этом коде... Наличие ошибки дважды предполагает, что вы пытаетесь подключиться дважды, также не в этом коде. В общем, похоже, что ошибка в процессе запуска приложения и использовании этой процедуры. Не могли бы вы добавить к вопросу немного больше кода, чтобы попытаться описать, как работает эта процедура запуска?   -  person GolezTrol    schedule 01.04.2019
comment
@GolezTrol Конечно, мне очень жаль. код очень функционален, поэтому его трудно добавить, я объясню это: предположим, что пользователь запускает приложение и хочет подключиться к базе данных, если он выберет значение в поле со списком и нажмет Enter, строка подключения будет создана в выше, и если значение изношено, появится сообщение об ошибке, и пользователь должен изменить значение поля со списком на правильное, тогда оно работает, но на полпути снова возникает ошибка с последним значением поля со списком. но строка подключения обновляется, так что кто может сбросить подключение   -  person Atrin Noori    schedule 01.04.2019


Ответы (1)


Этот ответ сработал для меня, и я обнаружил, что мне нужно 5 секунд sleep, чтобы вывести поток из ОЗУ.

function DBConnect: Boolean;
var
 conStr : string;
begin
 ini:= TMemIniFile.Create(GetCurrentDir + '\Settings.ini');
 Fstart_.StringTemp:= ini.ReadString('Server Directory', 'Server Name', KeyFileString);
 Application.CreateForm(TDataModule1, DataModule1);
 DataModule1.ADOConnection1.Close;
 conStr:= 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=admin'+Fstart_.year_combobox.Text+';PassWord=123;Initial Catalog=darman'+Fstart_.year_combobox.Text+';Data Source='+Fstart_.StringTemp+';';
 DataModule1.ADOConnection1.ConnectionString:= conStr;
 DataModule1.ADOConnection1.LoginPrompt:= False;
 try
  DataModule1.ADOConnection1.Open;
  Result:= True;
 Except on E:Exception do
  begin
   if e.Message = 'Login failed for user '+chr(39)+'admin'+Fstart_.year_combobox.Text+chr(39) then
     // Showmessage 
    [mbOK],0);
   if e.Message = '[DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied' then
    // ShowMessage
   DataModule1.ADOConnection1.Close;
   DataModule1.Destroy;
   Sleep(5000);
  end;
 end;
end;
person Atrin Noori    schedule 17.07.2020