如何在 Delphi 10.2 中连接到 SQL 服务器数据库之前测试 ADOConnection ConnectionString

How to test ADOConnection ConnectionString before connecting to SQL Server database in Delphi 10.2

我正在 Delphi 10.2 上开发一个应用程序,它连接到 SQL Server 2014 数据库。如何在应用程序启动前测试与具有连接字符串的数据库的连接?

我已经使用 ADoconnection 作为连接到上述数据库的接口,使用 try-catch 或 try-except 进行了一些编码以排除不需要的 SQL 服务器错误,并使用仪表条指示我的启动过程的进展(随着查询激活和表单创建而进展)。

所以当连接字符串不对时,我会得到

的错误

Login failed for user 'admin98'

(admin98 是 SQL 服务器用户的名称);当连接字符串正常时,仪表条会继续,在中途我再次遇到同样的错误。

注意:我使用了 freeInstanceNewInstance 或其他类似的东西,但没有用。

这是连接到数据库并在遇到错误时捕获错误的函数

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 服务器

中,我还是再次收到错误

这个答案对我有用,我发现我需要 5 秒 sleep 从 RAM

中获取线程
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;