2

我在从 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 服务器,但我完全没有想法。我只需要修复

4

5 回答 5

2

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

你可以通过谷歌搜索找到很多关于 SQL Profiler 的信息。这是一个包含视频的网站,可以帮助您入门。对于初学者,您将能够查看请求是否甚至到达数据库服务器。

于 2012-01-31T14:38:18.217 回答
2

您需要在调用之前打开连接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 

此外,请确保您的数据库未处于单用户模式。

于 2012-01-31T14:26:10.720 回答
2

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

于 2012-01-31T15:40:46.583 回答
0

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

来自 MSDN 博客 MSDN 博客

这将发生在从连接池中获取连接时,应用程序不知道物理连接已经消失,在假设物理连接仍然存在的情况下尝试使用它。

于 2012-01-31T15:08:59.220 回答
0

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

于 2012-01-31T14:28:13.327 回答