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

时间:2019-03-31 20:46:50

标签: sql-server delphi adoconnection

我正在使用Delphi 10.2上的应用程序,并且该应用程序连接到SQL Server 2014数据库。在应用程序启动之前,我该怎么做才能测试与具有连接字符串的数据库的连接?

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

因此,当连接字符串不正确时,我将收到错误消息

  

用户'admin98'登录失败

(admin98是SQL Server用户的名称);并且当连接字符串正常时,压力表将继续前进,并且在中途我又遇到了相同的错误。

注意:我使用了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 Server中,我仍然会再次收到错误消息

1 个答案:

答案 0 :(得分:0)

此答案对我有用,我发现我需要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;