代码之家  ›  专栏  ›  技术社区  ›  Sk93

datatablereader对当前datatable'tentable'无效[已关闭]

  •  8
  • Sk93  · 技术社区  · 16 年前

    每当我的代码从有效的datatable对象创建datatablereader时,就会出现以下错误:

    “DataTableReader对当前的DataTable“可试探”无效。”

    问题是,如果我重新启动我的机器,它在一段不确定的时间内可以正常工作,然后随着上述情况而死亡。抛出此错误的代码可能已经正常工作了几个小时,然后:砰。你得到这个错误。 它也不限于一行;它是使用datatablereader的每个位置。此外,此错误不会在生产Web服务器上发生-永远不会。

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

    一些技术信息:

    开发箱: Vista 32位(包含所有当前Windows更新) Visual Studio 2008第9.0.30729.1版SP Dotnet框架3.5 SP1

    SQLServer: 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服务器 4:尝试了使用DataTableReader的不同方法 5:清洗液

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

    我正在努力寻找可能的原因,因为没有代码错误-我百分之百确定,因为它在发布到web服务器时运行得非常完美。

    7 回复  |  直到 10 年前
        1
  •  7
  •   DotNetWala    16 年前

    我认为使用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方法。

    DataTableReader.HasRows Property

        2
  •  4
  •   Raymond Holmboe    14 年前

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

        3
  •  2
  •   user1750966    13 年前

    清理观察窗和进行重建对我很有帮助。然而,因为我不得不经常记得重建,我最终也改名了。(在重命名之前,在对象上添加额外的监视变量可能会导致该对象上以前的监视变量变为无效--即使没有继续执行代码(即保持在同一行上)

        4
  •  1
  •   Andrew Bezzub    16 年前

    使用 using .

        5
  •  1
  •   Sk93    16 年前

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

    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())
    {
        ...
    }
    

    我不明白为什么这样做,但它是这样的,因为我没有另一个答案,我会用这个。

    如果你知道为什么这样做,为什么原作不这样做,你能启发我吗?:)

        6
  •  1
  •   animuson    14 年前

    我想我会在这里发帖,以防对别人有帮助。我尝试了很多方法,最后我简单地更改了datareader的名称,它就工作了,有点类似于这里。我不知道为什么,但我想可能是因为数据读取器(最初)没有被关闭,所以也许经过几次调试,内存中有很多附加了特定名称的“东西”,它说“不要了!”尽管如此,我还是可以说牛逼。我的建议是,更改datareader变量的名称,并确保在使用后将其关闭

        7
  •  1
  •   Carlos de Luna Saenz    14 年前

    似乎是一个错误,在获取TableReader…我的代码一直在为EARS工作,如果我改变另一个方法,有时我会得到那个错误…有时它只是重新编译(重新编译)就解决了,另一次我重新安装了.NET框架或使用修复选项…我开始把try-catch部分放在reader上,如果系统“希望”给reader加上givme,如果不想给datatable加上givme。 问候语。