2016-04-01 12 views
2

У меня есть функция управления подключением к серверу. Если ado не может подключиться через 5 секунд, это должно привести к ошибке. Но свойство connectiontimeout не может работать.Delphi ADOConnection connection timeout свойство не работает

Вот код, я использую:

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

Какая версия Delphi? В Istr возникла проблема с тайм-аутом TAdoConnection, который использовался во многих версиях назад, вокруг эры i5 от D5. – MartynA

+0

Я использую Delphi XE6 –

+1

О, хорошо. Bt, почему вы звоните. Закройте соединение, которое вы только что создали? – MartynA

ответ

0

Вы не сказали, что вы подразумеваете под «не работает», но я предполагаю, что вы имеете в виду, что соединение не истекает в конце указанного вами периода.

Используя приведенный ниже код и ConnectionString, который, как гарантируется, будет терпеть неудачу (указав несуществующий сервер), кажется, что TAdoConnection не будет тайм-аут примерно через 9 секунд в моей локальной сети. Если период тайм-аута дольше указанного, он действительно истекает через более длительный период, но фактическое время не тесно коррелирует с указанным значением тайм-аута. Таким образом, указание значения тайм-аута «работает» в смысле наличия эффекта, но не похоже, если вы хотите, чтобы величина тайм-аута была такой же низкой, как ваша.

Я был бы удивлен, если что-то, что можно сделать через Ado из Delphi, чтобы преодолеть это ограничение. AdoConnection1.ConnectionTimeout просто передается в присоединенный к нему Ado ConnectionObject, и это находится на «другой стороне» интерфейса COM, поэтому, если он не отвечает, как вы хотите, есть, афайк, вы ничего не можете сделать Это. Что-то в настройках TCPIP машины могут иметь эффект, но я не мешая шахту, чтобы узнать =)

Update Вызванный другой SO д, я повторно мой код и минимальное время для ADOConnection времени в моей локальной сети пошло на 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

Точно я хотел сделать: в течение 5 секунд, если ADOconnection не может подключиться, выйдите из функции. Я не хочу кричать 30 или 60 секунд. –

+0

Ну, я пробовал свой код в D7 .. Сиэтл и то, что результаты говорят мне, что AdoConnection не будет тайм-аут в течение примерно 9,2 секунд, независимо от того, что вы установили значение. AdoConnection1.ConnectionTimeout просто передается в присоединенный к нему Ado ConnectionObject, и это находится на «другой стороне» интерфейса COM, поэтому, если он не отвечает, как вы хотите, есть, афайк, вы ничего не можете сделать Это. – MartynA

Смежные вопросы