我得到了这个SQL A传输级别的错误,但不是所有的时间

本文关键字:错误 时间 传输 SQL | 更新日期: 2023-09-27 18:22:11

我试图从数据库中查询数据,有时在日志中会出现以下错误:

从接收结果时发生传输级别错误服务器(提供程序: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;");

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

提前谢谢。

我得到了这个SQL A传输级别的错误,但不是所有的时间

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

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

关于您的情况,我的猜测是,SqlDataReaderSqlCommand正被另一个对数据库的调用从您身上拔出,而且这个问题是间歇性的,因为这是一种竞争条件。

当重置与Sql服务器实例的连接时,通常会出现这样的错误。

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

其他原因可能是:

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

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

希望这能有所帮助。

这个问题是由于您没有释放数据库连接。只需在代码中添加一个Finally语句,然后添加conn.Close()conn.Dispose()。我相信它会很好用的。

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

在我的情况下,我执行的查询是使用ACE OLE DB驱动器(Microsoft.ACE.OLEDB.12.0)从Excel文件中读取数据。驱动程序已损坏,重新安装该驱动程序解决了问题。

脚本是从PowerShell执行的,它也会使SQL Server实例崩溃,之后SQL Server实例将不会重新启动。很难找到这个原因。

收到的错误消息是:

调用Sqlcmd:接收时发生传输级别错误来自服务器的结果。(提供程序:共享内存提供程序,错误:0-管道已结束。)消息109,级别20,状态0,过程,第0行。

我一直在更改登录名、检查文件夹权限、错误日志、数据库损坏等,但在我的情况下,这就是原因。可以帮助别人。