【问题标题】:I get this SQL A transport-level error, but not all the time我收到此 SQL A 传输级错误,但并非总是如此
【发布时间】:2012-02-02 18:06:56
【问题描述】:

我尝试从数据库中查询数据,有时我的日志中出现此错误:

从 服务器。 (提供者:TCP 提供者,错误:0 - 句柄无效。) 代码位于 try-catch 块中。奇怪的是我没有 一直收到这个错误。 catch 块确实被执行了。

但是,无论我是否收到错误,我尝试填充的下拉列表都不会被填充。似乎没有从查询返回数据。

我正在建立与数据库的连接,数据在那里,我可以打开连接并对数据库运行查询。数据库与我运行代码的机器位于同一台机器上。

另外,当我连接到服务器上的数据库时,代码可以工作,但是当我没有连接到服务器时,我试图让本地数据库工作。当我想从本地数据库运行时,我只需要更改连接字符串。

这是查询数据库的函数

public static void QueryDB(string query)
    {
        cmd = new SqlCommand();
        cmd.CommandText = query;
        cmd.Connection = MyConn;
        if (dr != null) dr.Dispose();
        dr = cmd.ExecuteReader();
    }

这是连接数据库的连接字符串:

MyConn = new SqlConnection("Data Source=tcp:localhost; Database=EscalationManagementSystem; Integrated Security=true;");

是否存在错误的设置,或者这可能是代码中的错误。

提前致谢。

【问题讨论】:

  • 由于您没有向我们提供任何代码来审查,因此假设导致此问题的原因并不可靠。
  • 我猜drSqlDataReader 的痛处?这是一个全局变量吗?
  • 抱歉,drSqlDataReader
  • 尝试将所有更新安装到 MS Windows 和 MS SQL Server

标签: c# asp.net sql sql-server-2008


【解决方案1】:

我认为这是您代码中的错误。我认为您不应该有一个 SqlDataReaderSqlCommand 供所有对数据库的调用共享。

相反,您应该为每次调用数据库实例化一个新的SqlDataReaderSqlCommand,并在应用程序完成该特定 SQL 调用时释放(并关闭)它们。

我对您的情况的猜测是,SqlDataReaderSqlCommand 正在被另一个数据库调用从您下方拉出,并且该问题是间歇性的,因为它是一种竞争条件。

【讨论】:

  • 您是否建议将SqlDataReaderSqlCommand 放在using 块内?
  • 我将所有SqlDataReaderSqlCommand 放入using 块中,但它仍然不起作用。另外,SqlDataReader 和/或SqlCommand 从我下面被拉出来是没有意义的,因为数据库是本地的,只有当应用程序在本地运行时才会被访问。当我使用服务的数据库时,一切正常。
【解决方案2】:

这种错误通常会在您与 Sql 服务器实例的连接被重置时出现。

原因可能是网络连接重置。

其他原因可能是:

您请求 SQL Server 并从连接池接收数据。现在 SQL Server 发生了一些不好的事情(服务重新启动),您进行回发以获取数据。

检查以确保您的连接不会在后续请求之间中断。

希望这会有所帮助。

【讨论】:

  • 我在整个执行过程中检查了连接,它的状态始终是打开的。我仍然没有看到数据显示。
【解决方案3】:

这个问题是因为你没有释放你的数据库连接。只需在代码中添加Finally 语句并添加conn.Close()conn.Dispose()。我相信它会正常工作的。

finally 
{
    cmd.Connection.Close();
    cmd.Connection.Dispose();
} 

【讨论】:

    猜你喜欢
    • 2014-03-20
    • 2019-11-29
    • 1970-01-01
    • 2015-07-01
    • 2021-08-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多