2016-04-01 20 views
2

私はサーバー接続を制御する機能を持っています。 5秒で接続できない場合は、エラーが発生します。しかし、connectiontimeoutプロパティは機能しません。ここでDelphiのADOConnection接続タイムアウトプロパティが機能しません

は、私が使用していますコードです:

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; 

どのように私はこの問題を解決することができますか?

+0

どのデルファイバージョンですか? Istrには、D5時代のiircに関するラウンド前のTAdoConnectionのタイムアウト値に問題がありました。 – MartynA

+0

私はDelphi XE6を使用しています –

+1

ああ、ok。 Bt、なぜあなたは呼び出しているのですか?今作成したばかりの接続を閉じますか? – MartynA

答えて

0

あなたは「うまくいかない」ということを言っていませんでしたが、あなたが指定した期間の終わりに接続がタイムアウトしないということを意味します。

以下のコードと失敗することが保証されているConnectionString(存在しないサーバーを指定)を使用すると、TAdoConnectionは自分のLAN上で約9秒以内にタイムアウトしないようです。それより長いタイムアウト期間が指定されている場合は、実際にはより長い期間の後にタイムアウトしますが、実際の時間は指定されたタイムアウト値と密接に関連していません。だから、タイムアウト値を指定することは効果があるという意味で「働く」が、あなたのタイムアウト値を低くしたいとは思わない。

DelphiからAdoを介してこの制限を克服することができるものがあれば、私は驚くでしょう。 AdoConnection1.ConnectionTimeoutは、接続されたAdo ConnectionObjectに渡されます。これはCOMインターフェイスの「反対側」にあります。したがって、それが必要な方法で応答しない場合、afaikは何もできませんそれ。マシンのTCPIP設定で何かが効果を持っているかもしれないが、私は見つけるために地雷を乱さないよ; =)、別のSO Qに促され

更新、私は時間にADO接続のための私のコードと最小時間を再テスト私の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; 
+0

まさに私がやりたかったことです:ADOconnectionが接続できない場合、5秒以内に機能を終了してください。私は30秒または60秒を目覚めさせたくありません。 –

+0

さて、私はD7で自分のコードを試しました。シアトルとその結果は、あなたが値を設定しているかどうかにかかわらず、AdoConnectionは約9.2秒でタイムアウトしないということです。 AdoConnection1.ConnectionTimeoutは、接続されたAdo ConnectionObjectに渡されます。これはCOMインターフェイスの「反対側」にあります。したがって、それが必要な方法で応答しない場合、afaikは何もできませんそれ。 – MartynA

関連する問題