每当我的代码从有效的DataTable对象创建DataTableReader时,我都会收到以下错误:
“DataTableReader对当前的DataTable'TempTable'无效。”
问题是,如果我重新启动我的机器,它可以在不确定的时间内正常工作,然后在上面死掉。抛出此错误的代码可能已经工作好几个小时然后:爆炸。你得到这个错误。 它不仅限于一行;它是使用DataTableReader的每个位置。此外,生产Web服务器上也不会发生此错误。
在一周的最佳时间里,这一直让我感到疯狂,而且我在Google上找不到任何有用的东西(因为我非常肯定这不是编码问题)。
一些技术信息:
DEV Box: Vista 32bit(所有当前Windows更新) Visual Studio 2008 v9.0.30729.1 SP dotNet Framework 3.5 SP1
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:清洁解决方案
我唯一能找到的就是复制&粘贴代码 从主Visual Studio实例,到另一个有一个简单的控制台应用程序。 然后按预期工作(查询数据库并将结果放入dataTable,在该表上创建一个datatablereader,然后在调用.Read()之前查询hasrow ... 所有这些都有效。
我很难看到可能导致这种情况的原因,因为没有代码错误 - 我100%肯定,因为它在发布到网络服务器时运行得很好。
答案 0 :(得分:7)
我认为使用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方法。
答案 1 :(得分:4)
在观察窗口中清除变量后,出现了同样的问题并将其删除。
答案 2 :(得分:2)
清除观察窗口&amp;做重建对我有用。但是,因为我不得不记得经常重建,所以我最终也重命名了它。 (在重命名之前,在对象上添加额外的监视变量可能会导致该对象上的先前监视变量变为无效 - 即使没有通过代码,也就是停留在同一行上)
答案 3 :(得分:1)
使用using
包装DataTableReader(以及所有IDisposables)。
答案 4 :(得分:1)
OK ..在代码的下面,我有以下代码:
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())
{
...
}
我不明白为什么这种方式有效,但确实如此,因为我没有另外的答案,我会继续这样做。
如果您知道为什么会这样,以及为什么原来没有,请您启发我吗? :)
答案 5 :(得分:1)
以为我会在这里张贴,以防它帮助其他人。我尝试了很多东西,最后我简单地更改了datareader的名称并且它起作用了,类似于这里。我不知道为什么肯定,但我认为这可能是因为datareader(最初)没有被关闭,所以也许经过几次调试后,内存中有很多“东西”附加了某个名称,它说“不再!”。不过,我可能会说恃。我的建议,更改datareader变量的名称,并确保在使用后关闭它
答案 6 :(得分:1)
看起来像获取tableReader的错误...我有代码已经为耳朵工作,如果我改变另一种方法有时我得到那个错误...有时它解决了重新编译(重建),另一次我重新安装.NET框架或使用它的选项修复...我开始把try catch部分用于读取器,如果系统“想要”给读者和DataTable,如果没有。 问候。