2016-04-01 12 views
2

Ich habe eine Funktion zum Steuern der Serververbindung. Wenn sich die Verbindung nicht innerhalb von 5 Sekunden herstellen lässt, sollte ein Fehler auftreten. Die Eigenschaft connectiontimeout funktioniert jedoch nicht.Delphi ADOConnection Verbindung Timeout-Eigenschaft funktioniert nicht

Hier ist der Code Ich verwende:

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; 

Wie kann ich dieses Problem lösen?

+0

Welche Delphi-Version? Es gab ein Problem mit dem Timeout-Wert von TAdoConnection vor vielen Versionen, rund um die D5-Ära. – MartynA

+0

Ich benutze Delphi XE6 –

+1

Oh, ok. Bt, warum rufst du an. Schließe dich auf eine Verbindung, die du gerade erstellt hast? – MartynA

Antwort

0

Sie haben nicht gesagt, was Sie mit "funktioniert nicht" meinen, aber ich nehme an, Sie meinen, dass die Verbindung am Ende des von Ihnen angegebenen Zeitraums keine Zeitüberschreitung verursacht.

Mit dem folgenden Code und einem ConnectionString, der garantiert fehlschlägt (indem ein nicht vorhandener Server angegeben wird), scheint es, dass eine TAdoConnection nicht in weniger als 9 Sekunden in meinem LAN abläuft. Wenn ein Zeitüberschreitungszeitraum länger als angegeben ist, wird zwar nach einer längeren Zeit ein Timeout ausgeführt, die tatsächliche Zeit ist jedoch nicht eng mit dem angegebenen Zeitlimitwert korreliert. Die Angabe eines Timeout-Werts funktioniert also im Sinne eines Effekts, aber nicht scheinbar, wenn Sie einen so niedrigen Timeout-Wert wünschen wie Ihren.

Ich wäre überrascht, wenn es etwas gibt, das über Ado von Delphi getan werden kann, um diese Beschränkung zu überwinden. Das AdoConnection1.ConnectionTimeout wird einfach an das Ado ConnectionObject übergeben, das an das Ado ConnectionObject angehängt ist, und das auf der "anderen Seite" der COM-Schnittstelle. Wenn es nicht wie gewünscht reagiert, gibt es afaik, nichts, was Sie dagegen tun können es. Etwas in der TCPIP Einstellungen der Maschine auswirken kann, aber ich bin nicht von mir stören, um herauszufinden; =)

aktualisiert von einem anderen SO q Angeregt, erneut getestet ich meinen Code und die minimale Zeit für die ADOConnection zu Zeit out auf meinem LAN ist auf 2,8 Sekunden gegangen, ohne Hardware-Änderung oder bewusste Änderung der Software. Möglicherweise wurde der Unterschied durch etwas in einem Win10-Update verursacht.

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

Genau wollte ich tun: innerhalb von 5 Sekunden, wenn die ADOconnection keine Verbindung herstellen kann, beenden Sie die Funktion. Ich will nicht 30 oder 60 Sekunden wailt. –

+0

Nun, ich habe versucht, meinen Code in D7 .. Seattle und was die Ergebnisse sagen mir ist, dass die AdoConnection nicht in unter 9,2 Sekunden, unabhängig von dem, was Sie den Wert zu sein, Timeout sein wird. Das AdoConnection1.ConnectionTimeout wird einfach an das Ado ConnectionObject übergeben, das an das Ado ConnectionObject angehängt ist, und das auf der "anderen Seite" der COM-Schnittstelle. Wenn es nicht wie gewünscht reagiert, gibt es afaik, nichts, was Sie dagegen tun können es. – MartynA

Verwandte Themen