【问题标题】:Why is my SQL Connection Timing out?为什么我的 SQL 连接超时?
【发布时间】:2015-01-12 17:40:25
【问题描述】:

在我的独立 Windows 应用程序中,我有一个连接字符串:

Private Const _sqlDB As String = "Data Source=(localdb)\v11.0;Initial Catalog=localACETest;Integrated Security=True;AttachDbFileName=C:\ACE DB\localACETest.mdf"

我正在向其中添加连接超时(没关系,这是一个荒谬的长超时):

";Connect Timeout=1000"

谁能解释为什么我现在的程序超时而不是在添加连接超时之前?

以下是我创建连接的方式:

        _conn = New SqlConnection(_sqlDB)
        _conn.Open()

        Dim _dr As SqlDataReader
        Dim _cmd As New SqlCommand("Random Stored Procedure", _conn)
        _cmd.Parameters.Add("@BusGrp", System.Data.SqlDbType.NVarChar).Value = bg
        _cmd.CommandType = System.Data.CommandType.StoredProcedure

当我删除连接超时并添加命令超时时,这似乎不会发生,但是:

        _cmd.CommandTimeout = 1000

虽然我知道命令和连接超时是两个不同的东西,但添加 连接 超时来扩展默认值会导致这个问题对我来说没有意义。

【问题讨论】:

  • 你的属性不正确,应该是Connection Timeout - msdn.microsoft.com/en-us/library/…
  • 为避免此类问题,我始终建议使用 SqlConnectionStringBuilder,它不会让您构建无效的连接字符串。
  • 我以此为参考:connectionstrings.com/all-sql-server-connection-string-keywords 感谢你们的帮助。
  • 所有的下划线、缩写和显式的类名链接是怎么回事?这是您的第一个应用程序吗?
  • 我加入了一个有这个系统的团队......我也不知道什么是类名链接。

标签: sql vb.net connection-timeout


【解决方案1】:

您使用的连接超时属性不正确:

Connect Timeout=1000

应该是

Connection Timeout=1000

MSDN documentation 中为Connection Timeout 列出了正确的属性。 下面是使用 SQL 数据库的正确方法(取自相同的 MSDN 文档):

正如通过 cmets 所讨论的,您实际上是在连接到 SQL 服务器,这里有一个更好的方法:

Sub connectToDb()
    myConn = New SqlConnection("Server=(local);Database=[.database name here.];User Id=[.username here.];Password=[.password here.];")
    Dim returnValue As Object
    cmd.CommandType = CommandType.Text
    cmd.Connection = myConn

    Try
        myConn.Open()
        MsgBox("Connected to SQL")
    Catch excep As Exception
        MsgBox("An error occurred: " + excep.Message)
    End Try
End Sub

要查询数据库中的某些内容,您可以使用:

    cmd.CommandText = "USE [.database name.]"
    cmd.ExecuteScalar()
    cmd.CommandText = "[.SQL query.]"
    returnValue = cmd.ExecuteScalar() 'You can check the returnValue to see if the query returned anything.

如果您遇到无法同时执行多个查询的错误,则必须通过将MultipleActiveResultSets=True; 附加到您的连接字符串来启用MARS

【讨论】:

  • 将连接字符串存储在文件中是否比简单地将其放在类的顶部更有效?
  • @user 可能不会,因为您必须先读取文件,这会占用更多内存,并且会增加进入数据库所需的时间。
  • 如果需要更改连接字符串怎么办?您是否替换程序而不是编辑配置文件?微优化是否值得失去灵活性?
  • @Steve 好点。如果程序正在分发,我可能会将连接字符串存储在文件中only,如果只有一个人使用该程序,我可能会使用硬编码的连接字符串。如果数据库用于存储程序设置,Setting 可能比完整的数据库更好。
  • 虽然它工作得更好,但我正在使用 1000 的实际值进行测试,并且在计时器达到 1000 秒之前,我仍然会从存储过程中获得超时:“错误:超时已过期。在操作完成之前超时时间已过或服务器没有响应”想法?
【解决方案2】:

在连接字符串中使用的关键字是ConnectTimeout(无空格)或Connection Timeout,如here 所示。你在Connect Timeout 中有一个空格,如果你设置它并删除行_cmd.CommandTimeout = 1000,它可能会忽略连接字符串值,因为它是不正确的关键字并使用默认值 15 秒。

尝试将连接字符串更改为使用Connection Timeout=1000

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多