Vb.net SqlDataReader项属性失去连接
我使用Vb.net SqlDataReader项属性失去连接,vb.net,visual-studio,database-connection,sqldatareader,Vb.net,Visual Studio,Database Connection,Sqldatareader,我使用SqlDataReader读取多个表上的大型SQL Server查询(遗留)。它通常要处理的行数有限,但最近我不得不使用它来处理更多的行 经过多次迭代后,SqlDataReader对象在读取Item()属性时,抛出一个SqlException,代码为0x80131904,消息为“Une erreur de niveau transport s'est produite lors de la reception des résultats du serveur”。(提供者:TCP提供者,错误
SqlDataReader
读取多个表上的大型SQL Server查询(遗留)。它通常要处理的行数有限,但最近我不得不使用它来处理更多的行
经过多次迭代后,SqlDataReader
对象在读取Item()
属性时,抛出一个SqlException
,代码为0x80131904,消息为“Une erreur de niveau transport s'est produite lors de la reception des résultats du serveur”。(提供者:TCP提供者,错误:0 Une连接存在一个d席夫席夫远。)(下面的更多细节)
消息是用我的母语法语写的,我不完全确定官方英语版本是什么。我的翻译是,经过一些网络搜索后,“从服务器接收结果时发生了传输级错误。(提供程序:TCP提供程序,错误:0-远程主机强制关闭了现有连接)。”
我再次尝试:异常被抛出在完全相同的行中,读取完全相同的字段。(随后的尝试显示异常可能被抛出在不同的位置,但差别不大:在八次尝试中,异常仅被抛出在三个不同的位置。)
SqlDataReader
对象在前面的Read
迭代中愉快地读取相同的字段,并且检查数据库中的查询结果表明引发异常的行没有特定的值
我尝试调整查询的Where
子句以更快地到达异常:它实际上读取了比以前更多的行,然后在不同的行上抛出了相同的异常(但同样,每次调整查询都或多或少在同一行上)
仔细看,我在抛出异常的指令上放置了一个条件断点。结果是:
- 使用QuickWatch读取
属性会引发相同的异常Item()
- 读取当前迭代中尚未读取的另一个字段的
属性会引发相同的异常Item()
- 相反,读取当前迭代中已读取的其他字段的
属性不会引发异常Item()
SqlDataReader
的属性。状态发生了变化,从Open
变为Closed
(这与异常一致)。ClientConnectionId
也发生了变化,它的新值是一系列的0
s
发生了什么,我怎样才能防止
附录1
打开SqlDataReader的代码如下所示:
Dim z_dreLecteur As IDataReader = Nothing
Dim z_dcdCommande As IDbCommand = Nothing
[...]
If TypeOf p_dcxConnexion Is SqlConnection Then
z_dcdCommande = New SqlCommand(p_strQuery, DirectCast(p_dcxConnexion, SqlConnection))
Exit Try
End If
[...]
z_dcdCommande.CommandTimeout = 600
[...]
z_dreLecteur = z_dcdCommande.ExecuteReader()
[...]
z_dcdCommande.Dispose()
p_dcxconnection
是一个参数,在上述代码运行之前已设置
附录2
有关SqlException
的更多详细信息。
它有一个InnerException
:
- 类型
System.ComponentModel.Win32Exception
ErrorCode
-2147467259
>代码>消息>代码>“席”,存在“远程席席”(“现有的联席被远程主机强制关闭”),
NativeErrorCode
10054
SqlException
具有:
ErrorCode
-2146232060
Number
10054
(代码:>消息>代码:”提供者:TCP提供者,错误:0 Une连接存在一个d席席夫éé'''''.''''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.'''.''.''.''.''.(提供程序:TCP提供程序,错误:0-远程主机已强制关闭现有连接。)
如果需要,我可以添加StackTrace
,但它实在太大了,所以我暂时不添加。这个程序是否只使用一个SqlConnection(错误),或者它是否创建了一个SqlConnection,执行了这个操作,并立即处理了SqlConnection(正确的方法)?我发现了这个可能的原因:“选项下的数据库属性”“自动关闭”被设置为True,允许服务器关闭“非活动”连接。这必须设置为False。“这里有禁用它的方法。可能是-1。)服务器已重新启动,这将关闭现有连接。2。)有人或某事已杀死正在使用的SPID。3。)存在故障转移(例如,在镜像设置中)再次查看SQL Server日志。如果存在故障转移,请尝试将此时间戳与异常时间关联。4.)这也可能是由其他与SQL Server无关的原因造成的。@AndrewMorton:事实上:相同的连接字符串,不同的SqlConnection
对象。尽管如此,我发现注释它们会使循环持续更长时间,然后我找到了一种方法将它们合并到主查询中。那一次,这个过程自然结束了,没有发生任何意外!我高兴地拍了拍自己的后背,然后再试一次,这是肯定的:它又崩溃了。Jean DavidLanz程序中是否有某些处理过程导致其花费的时间比SSMS结果长得多?如果是的话,你能读入数据然后处理它吗?