【问题标题】:How to test ADOConnection ConnectionString before connecting to SQL Server database in Delphi 10.2如何在 Delphi 10.2 中连接到 SQL Server 数据库之前测试 ADOConnection ConnectionString
【发布时间】:2019-08-22 00:59:41
【问题描述】:

我正在开发 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 中,我也会再次收到错误

【问题讨论】:

  • 在这些情况下可以工作的是运行一个后台线程,每隔几秒钟尝试连接到服务器。如果最近连续多次失败,您可以在尝试使用 ADOConnection1 连接之前通知用户。
  • @MartynA 谢谢你的回答,但是多线程的事情现在对我来说有点太难了,基于应用程序的其他部分,我以后会遇到很多问题
  • 反复阅读,我无法理解您的问题。您提到错误消息,不能来自此代码,因为它吞噬了所有内容。您提到了 NewInstance 和 FreeInstance,无论如何您都不应该调用它们,但它们不在此代码中……两次出现错误表明您尝试连接两次,也不在此代码中。总而言之,听起来错误在于应用程序启动的流程和此过程的使用。您能否在问题中添加更多代码来尝试描述该启动例程的工作原理?
  • @GolezTrol 当然,我很抱歉。该代码是非常基于功能的,因此很难添加我将其解释为:考虑用户运行应用程序并想要连接到数据库,如果他们在组合框中选择一个值并点击“输入”,则连接字符串将是在上面的函数中创建,如果值已磨损,则会提示错误,用户必须将组合框的值更改为正确的值,然后它才能工作,但在中途再次出现最后一个组合框值的错误。但是连接字符串已更新,所以我可以重置谁的连接

标签: sql-server delphi adoconnection


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2018-12-25
    • 2017-05-06
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多