我正在Delphi10.2上开发一个应用程序,它连接到一个SQL Server 2014数据库。在应用程序启动之前,我可以做些什么来测试具有连接字符串的数据库的连接?
我使用ADoconnection作为连接到上述数据库的接口,使用try-catch或try进行了一些编码,但排除了不必要的Server错误,并使用量规条来指示我的开始过程的进度(该过程通过查询激活和表单创建取得进展)。
因此,当连接字符串不确定时,我将得到一个错误
用户“admin98”登录失败
(admin98是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;问题是它必须工作,我不应该重新启动应用程序,所以我需要在连接之前进行测试,或者重置整个连接。
我希望连接成功,但即使我更改组合框值,并且我知道用户存在于Server中,也会再次得到错误
发布于 2020-07-17 10:03:11
这个答案对我有效,我发现我需要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;https://stackoverflow.com/questions/55445328
复制相似问题