【问题标题】:SQL Connection Forcibly ClosedSQL连接被强制关闭
【发布时间】:2012-01-31 14:24:10
【问题描述】:

我在从 IIS7 对 Server 2008 进行 SQL 查询时遇到困难。我有一个运行更新语句的 VB.NET 类库。用于创建连接的底层代码没有改变,但突然查询在我们的测试和开发环境中失败了。但是,它仍然可以在我们的生产环境中使用稍旧的代码在同一个服务器/数据库上工作。

我尝试在 web.config 中设置连接超时,但无法解释原因。

查询的基本结构是:

Dim conn = New SqlConnection()
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass"
conn.Open()
Using cmd As SqlCommand = conn.CreateCommand()
    cmd.CommandText = "UPDATE ..."
    cmd.Parameters.AddWithValue("@UName", user.name)
    cmd.ExecuteNonQuery() 'fails with error
End Using

错误是:

将请求发送到 服务器。 (提供者:TCP 提供者,错误:0 - 现有连接是 被远程主机强行关闭。)

我已经尝试重新启动 IIS 和 SQL 服务器,但我完全没有想法。我只需要修复

【问题讨论】:

  • 您能否在代码中的其他位置运行使用相同连接字符串的其他命令?也就是说,我们可以确认您的实际连接字符串有效吗?
  • 是的,代码可以通过 SMSS 运行,也可以在 Web 应用的其他部分运行。

标签: asp.net sql sql-server connection-timeout


【解决方案1】:

您需要在调用SqlCommand.ExecuteNonQuery() 之前打开连接。你可以通过调用SqlConnection.Open()来做到这一点。

Dim conn = New SqlConnection() 
conn.ConnectionString = "Data Source=someserver\sqlexpress2008;Initial Catalog=DatabaseName;User ID=sa;Password=pass" 
Using cmd As SqlCommand = conn.CreateCommand() 
    cmd.CommandText = "UPDATE ..." 
    cmd.Parameters.AddWithValue("@UName", user.name) 

    conn.Open()
    cmd.ExecuteNonQuery() 'fails with error 
    conn.Close()
End Using 

另外,请确保您的数据库不是处于单用户模式。

【讨论】:

  • 抱歉,连接是打开的,我误删了那行。
  • @Echilon 您的数据库是否可能处于单用户模式?尝试通过 SSMS 建立多个连接。
【解决方案2】:

这帮助了另一个最近陷入困境的人。您可以通过设置 SQL Server Profiler 从数据库服务器检查问题。

您可以通过谷歌搜索找到很多关于 SQL Profiler 的信息。这是一个site with a video,可能会帮助您入门。对于初学者,您将能够查看请求是否甚至到达了数据库服务器。

【讨论】:

    【解决方案3】:

    这是一场噩梦。事实证明这是由 VB.NET 中的一个可怕的怪癖引起的。可空日期时间似乎被强制为DateTime.MinValue,这导致DateTime.MinValue 被插入到sql datetime 中。修复是在设置命令参数时检查!property.HasValue && property.Value != DateTime.MinValue

    【讨论】:

    • 不知道这将如何导致连接错误...我希望会产生一些错误,但不会产生您得到的错误。
    • 这正是让我感到困惑的地方,但是当我将值更改为 DBNull.Value 时,查询工作正常。
    • 您采取了哪些步骤得出这个结论?
    【解决方案4】:

    这是网络级错误。数据库服务器出于某种原因正在终止连接。为了解决这个问题,我将使用 SSMS 打开到 DEV 和 TEST 服务器的连接,并确保我可以运行没有问题的简单查询。问题不太可能出在您的库上,因为您会遇到超时或其他类型的错误。

    【讨论】:

      【解决方案5】:

      正如 Lcarus 所说,数据库服务器正在以未知原因终止连接。 您可以检查日志以进行验证。日志路径为C:\Program Files\Microsoft SQL Server\<your instance>\MSSQL\LOG

      来自 MSDN 博客MSDN Blog

      当从连接池中取出一个连接时会发生这种情况, 应用程序不知道物理连接已经消失, 尝试使用它是在假设物理 连接仍然存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        • 2012-11-03
        相关资源
        最近更新 更多