Delphi ADOConnection连接超时属性不起作用

时间:2016-04-01 11:42:03

标签: delphi adoconnection

我有一个控制服务器连接的功能。 如果ado无法在5秒内连接,则应该出错。但是connectiontimeout属性不起作用。

以下是我正在使用的代码:

function AdoConnectionTester(strServerName, strUserName, strPassword,
    strDBName: string; boolShowMessage: boolean): Boolean;
var
  ADOConn: TADOConnection;
begin
  try
    Result := True;
    ADOConn := TADOConnection.Create(nil);
    ADOConn.LoginPrompt :=False;
    ADOConn.Close;
    ADOConn.ConnectionString := 'Provider=SQLOLEDB.1;    Password='+strPassword+';'+
                                 'Persist Security Info=True;User ID='+strUserName+';'+
                                 'Initial Catalog='+strDBName+';'+
                                 'Data Source='+strServerName;
try
  ADOConn.ConnectionTimeout := 5;
  ADOConn.Open;
except
  on E: Exception do
  begin
    Result := False;
    ShowMessage(E.Message);
  end;
end;
if Result then
  if boolShowMessage = True then
    ShowMessage('OK');
  finally
    ADOConn.Free;
  end;
end;

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你没有说出你的意思"不起作用",但我认为你的意思是连接不会在你指定的时间段结束时超时。

使用下面的代码和保证失败的ConnectionString(通过指定不存在的服务器),似乎TAdoConnection不会在我的LAN上大约9秒内超时。如果指定了超过该超时时间段的超时时间段,则确实会在较长时间段后超时,但实际时间与指定的超时值不紧密相关。因此,指定超时值确实可以“工作”。从某种意义上讲,如果你想要一个与你一样低的超时价值,那就好了。

如果有任何可以通过德尔福的Ado来克服这个限制,我会感到惊讶。 AdoConnection1.ConnectionTimeout简单地传递给附加到它的Ado ConnectionObject,并且在#34;另一侧" COM界面,所以如果它没有回应你想要的,那么就没有什么可以做的了。机器的TCPIP设置中的某些东西可能有效,但我并不打扰我发现; =)

更新由另一个SO q提示,我重新测试了我的代码,AdoConnection在LAN上超时的最短时间已经减少到2.8秒,没有任何硬件更改或有意识地更改软件。可能差异是由Win10更新中的某些内容引起的。

procedure TForm1.TestConnectionTimeOut(Timeout : Integer);
var
  T1 : Integer;
begin
  T1 := GetTickCount;
  AdoConnection1.ConnectionTimeout := Timeout;
  try
    AdoConnection1.Connected := True;
  except
    ShowMessage(Exception(ExceptObject).Message + #13#10 + IntToStr(GetTickCount - T1));
  end;
end;