针对SQL Server管理登录超时过期错误

时间:2019-05-30 15:45:43

标签: sql-server vb.net

我每小时都会执行下一个VB.NET代码。该代码连接到该服务器和该数据库,并不仅在数据库MyDatabase上而且还在同一服务器上的其他数据库上执行一些命令。

由于用户是sysadmin,因此它具有对所有数据库的管理员访问权限,而没有问题。

Dim ConnStr As String
Dim Conn As SqlConnection
Dim cM As SqlCommand
Try
    ConnStr = "Server=MyServer;Database=MyDatabase;User Id=MyUsername;Password=MyPassword;Connect Timeout=300"
    Dim Conn As New SqlConnection(ConnStr)
    cM = New SqlCommand("", Conn) 'The SQL code comes from an script file (*.sql)
    cM.CommandTimeout = 1800
    cM.Connection = Conn
    Conn.Open()
    cM.ExecuteNonQuery()
Catch eX As Exception
    Dim strError As String = ex.Message
    If Not ex.InnerException Is Nothing Then strError &= " | " & ex.InnerException.Message
    strError = "Connection Timeout: " & Conn.ConnectionTimeout.ToString & " | " & _
        "Command Timeout: " & cM.CommandTimeout.ToString & " | " & _
        strError
    objLogging.LogErrorStep(JobID, JobName, CurrentStepName, strError)
Finally
    If Conn.State = ConnectionState.Open Then Conn.Close()
    Conn.Dispose()
End Try

我们正在尝试的问题是由于登录超时过期错误,此作业的某些运行失败:

Connection Timeout: 300 | Command Timeout: 1800 | TCP Provider: Timeout error [258]. 
OLE DB provider "SQLNCLI10" for linked server "(null)" returned message "Login timeout expired".
OLE DB provider "SQLNCLI10" for linked server "(null)" returned message "Unable to complete login process due to delay in prelogin response".

您可以在代码中看到,我将错误保存在Logging表中,并且还将当前的Connection Timeout和当前的Command Timeout保存在那里。

令我惊讶的是,当我检查“日志记录”表中的错误时,可以看到命令启动时间与命令失败时间之间的经过时间,而当我的连接超时时,经过时间仅为15秒设置为300。查看下一张图片:

enter image description here

如您所见,EventStart和EventStop之间的差异约为15秒。如果该过程由于连接超时而失败,并且将其设置为300,则经过的时间应该为300,不是吗?

感谢您的帮助和评论。

编辑2019-05-31

在等待了一天的时间之后,在OPEDATASOURCE connectionString中设置了Connect Timeout = 300属性,今天下午我又得到了一个新的登录超时,也只是15秒(见图)

enter image description here

1 个答案:

答案 0 :(得分:0)

连接超时和CommandTimeout设置适用于从客户端到“ MyDatabase”的连接。由于您的SQL命令连接到链接服务器,因此这些设置将不会自动传输,而必须在SQL Server级别进行配置。请注意,此更改立即生效,并且是服务器范围(T-SQL):

EXEC sp_configure 'remote login timeout', 300;  
GO  
RECONFIGURE ;  
GO  

EXEC sp_configure 'remote query timeout', 1800;  
GO  
RECONFIGURE ;  
GO

查看这两个相关的MSDN链接:

Remote Login Timeout

Remote Query Timeout