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