C# DataTableReader对当前DataTable无效';诱人的';

C# DataTableReader对当前DataTable无效';诱人的';,c#,sql,visual-studio-2008,exception,C#,Sql,Visual Studio 2008,Exception,每当我的代码从有效的DataTable对象创建DataTableReader时,我都会遇到以下错误: “DataTableReader对于当前DataTable‘可诱惑’无效。” 问题是,如果我重新启动我的机器,它会在一段不确定的时间内正常工作,然后随着上述情况而消失。抛出此错误的代码可能已经正常工作了几个小时,然后:砰。你会得到这个错误。 它也不局限于一条线;它是使用DataTableReader的每个位置。此外,此错误从未在生产web服务器上发生过 这一周的大部分时间都让我发疯,我在谷歌上找

每当我的代码从有效的DataTable对象创建DataTableReader时,我都会遇到以下错误:

“DataTableReader对于当前DataTable‘可诱惑’无效。”

问题是,如果我重新启动我的机器,它会在一段不确定的时间内正常工作,然后随着上述情况而消失。抛出此错误的代码可能已经正常工作了几个小时,然后:砰。你会得到这个错误。 它也不局限于一条线;它是使用DataTableReader的每个位置。此外,此错误从未在生产web服务器上发生过

这一周的大部分时间都让我发疯,我在谷歌上找不到任何有帮助的东西(因为我很肯定这不是编码问题)

一些技术信息:

开发框: Vista 32位(具有所有当前windows更新) Visual Studio 2008 v9.0.30729.1 SP dotnetframework3.5sp1

SQL Server: Microsoft SQL Server 2005标准版-9.00.4035.00(X64) Windows 2003 64位(包含所有当前Windows更新)

Web服务器: Windows 2003 64位(包含所有当前Windows更新)

任何帮助、想法或建议都将不胜感激

更新1:

确定-已尝试以下操作,但未成功:

1:重新启动 2:SFC/ScanNow 3:更改的SQL Server 4:尝试了使用DataTableReaders的其他方法 5:清洁溶液

我发现唯一有效的方法就是复制和粘贴代码 从主VisualStudio实例到另一个具有简单控制台应用程序的实例。 然后,它按预期工作(查询数据库并将结果放入dataTable,在该表上创建datatablereader,然后在调用.Read()之前查询hasrows)。。。 所有这些都奏效了


我正在努力寻找导致这种情况的原因,因为没有代码错误-我百分之百确定,因为它在发布到Web服务器时运行得很好。

使用
包装DataTableReader(以及所有IDisPobles)的使用
使用

我认为使用while(reader.read())可以解决您的问题

if (myReader.HasRows)
   while (myReader.Read())
     Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0), myReader.GetString(1));
else
   Console.WriteLine("No rows returned.");
myReader.Close();
更新: 同样来自msdn: HasRows属性返回有关当前结果集的信息。如果DataTableReader包含多个结果集,则可以在调用NextResult方法后立即检查HasRows属性的值,以确定新结果集是否包含行

使用HasRows属性可以避免在当前结果集中没有行时调用DataTableReader的Read方法的要求


好的..在代码的下面,我有以下代码:

using (DataTableReader tr = dtCustomers.CreateDataReader())
{
    ....
}
如果我将此更改为:

using (DataTableReader tr2 = dtCustomers.CreateDataReader())
{
    ....
}
然后,请记住,这段代码稍后会在同一个过程中完成,两段代码都可以正常工作

所以,这不起作用:

using (DataTableReader tr = dt.CreateDataReader())
{
    ...
}

....

using (DataTableReader tr = dt.CreateDataReader())
{
    ...
}
但这确实:

using (DataTableReader tr = dt.CreateDataReader())
{
    ...
}

....

using (DataTableReader tr2 = dt.CreateDataReader())
{
    ...
}
我不明白为什么这种方法有效,但它确实有效,因为我还没有其他答案,所以我将采用这种方法


如果你知道为什么这行得通,为什么原作不行,请你告诉我好吗?:)

我想我会在这里发布,以防对其他人有所帮助。我尝试了很多方法,最后我只是简单地更改了datareader的名称,它起了作用,有点类似于这里。我不知道为什么,但我想可能是因为datareader(最初)没有关闭,所以可能在调试了几次之后,内存中有很多附加了某个名称的“东西”,它说“没有了!”。不过,我可能是在说牛头派。我的建议是,更改datareader变量的名称,并确保在使用该变量后将其关闭

似乎是获取tableReader的一个错误。。。我的代码一直在为EAR工作,如果我改变另一种方法,有时我会得到那个错误。。。有些时候只是重新编译(重建)就解决了,另一些时候我重新安装了.NET framework或使用修复选项。。。我开始放置try-catch部分,如果系统“想要”givme读卡器,则使用读卡器,如果不想要,则使用数据表。
问候。

也有同样的问题,在清除监视窗口中的变量后解决了。

清除监视窗口并进行重建对我来说很有效。然而,因为我必须记得经常重建,我最终也将其重命名。(在重命名之前,在对象上添加额外的监视变量可能会导致该对象上以前的监视变量变为无效--即使没有继续执行代码,即保持在同一行)

这并没有真正的帮助。我创建对象,关闭对象并处理对象。。如上面的代码示例所示。这将有助于避免其他问题-如果在关闭读卡器之前发生异常,它将保持未关闭状态。使用语句有助于避免这种情况,但事实并非如此。如果它抛出异常并超出范围,那么它将像往常一样关闭并通过垃圾收集器进行处理。但是是的,使用语句是更好的方法,我通常使用它们。但是,此代码是由其他开发人员编写的“旧”代码。。它过去工作得很好。谢谢你的指点,但我要找的是一个解决问题的详细方案。。。希望您理解:)@Sk93:是的,它最终会被垃圾回收,但在此期间,连接将保持打开状态。在某个时刻,您的连接池将溢出。这可能会导致你看到的奇怪错误。最好的做法是在任何实现IDisposable的东西上使用“using”,以避免此类问题。+1建议“using”(假设您在本地托管SQL server)您的本地驱动器空间是否不足?好问题,我没有检查这个问题。。。但遗憾的是,我在每个驱动器上都有大量的可用空间(准确地说是817GB),我尝试了同事的建议,清除了“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\临时ASP.NET文件”,但在第一个pl中它并不存在