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结果长得多?如果是的话,你能读入数据然后处理它吗?