我得到了这个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;");
是否存在错误的设置,或者这可能是代码中的错误?
提前谢谢。
我认为这是代码中的一个错误。我认为不应该有一个SqlDataReader
和SqlCommand
,由所有对数据库的调用共享。
相反,您应该为数据库的每个调用实例化一个新的SqlDataReader
和SqlCommand
,并在应用程序完成该特定SQL调用时处理(并关闭)它们。
关于您的情况,我的猜测是,SqlDataReader
或SqlCommand
正被另一个对数据库的调用从您身上拔出,而且这个问题是间歇性的,因为这是一种竞争条件。
当重置与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行。
我一直在更改登录名、检查文件夹权限、错误日志、数据库损坏等,但在我的情况下,这就是原因。可以帮助别人。