【问题标题】:DataTable not loading SqlDataReaderDataTable 未加载 SqlDataReader
【发布时间】:2015-12-17 15:25:02
【问题描述】:
using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlCommand command = new SqlCommand(sqlCommand, connection))
        {
            command.CommandType = CommandType.Text;
            connection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                DataTable datatable = new DataTable();
                datatable.Load(reader);

                return datatable;
            }
        }
    }

运行此代码会返回一个空的 DataTable。但是,循环通过reader.Read() 并打印到调试控制台表明阅读器有数据并且它会打印预期的数据。此外,当我在调试期间展开阅读器对象时,hasRows 为 true,并且字段计数与返回的列数相符。

这里有一个类似的帖子 Trouble loading SQL Data Reader data into DataTable 但答案基本上是,不要使用它,使用SqlDataAdapter。我更喜欢使用它,DataTable 有一个加载方法,它采用 IDataReader DataTable.Load(IDataReader)。我只是不知道为什么当我将它打印到调试窗口时阅读器正在工作,但当我将它加载到DataTable 时却没有。我只是忽略了什么吗?

【问题讨论】:

  • @SonerGönül 我在 SqlDataReader 上看不到 Fill 方法 msdn.microsoft.com/en-us/library/…
  • 使用SqlDataAdapter 并使用它的Fill 方法怎么样?
  • @SonerGönül 我可以使用SqlDataAdapter,但我只是好奇为什么DataTable 上的适当方法不起作用...... SqlDataReader 更快,我更喜欢使用它。以下是有关差异的一些信息stackoverflow.com/a/1676809/3866019
  • 我怀疑有什么区别 - DataTable.Load 无论如何在内部使用数据适配器 :) 您链接的答案中使用 SqlDataReader 的所有“好处”仅在您不使用时适用读者填写DataTable (这不应该是意外的,因为数据适配器只是使用数据阅读器填充数据表;如果您使用数据阅读器手动执行此操作,您会期望在哪里获得任何好处?您是做完全相同的事情。成本在数据表中。)。在不了解实际情况的情况下接受这样的建议时要小心——这会很痛苦。
  • 无论如何,DataTable.Load 对我来说很好用。如果您保持一切原样并使用数据适配器来填充表格,它真的有效吗?你有多个结果集吗?命令有什么作用?

标签: c# .net datatable sqldatareader


【解决方案1】:

原来我只是忽略了一些东西,而这实际上根本不是问题。原始代码实际上工作正常。调试时DataTable 对象的预览显示{},在我看来是空的。

然后有一个名为ExtendedProperties 的对象上的属性有Count = 0,这显然不是行数,但我只是掩饰并得到Count = 0 卡在我的脑海中。

如果您发现自己处于相同情况,请在悬停对象时向下滚动并展开 Rows,您应该会在其中看到您的行数。

我在这件事上被骗了……对我的愚蠢感到抱歉,感谢大家的帮助。

【讨论】:

  • 那么你是怎么解决这个错误的,你没有提到你注意到的这个
  • 天哪……太可怕了
【解决方案2】:

尝试这样做,看看是否有效......

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter dap = new SqlDataAdapter(sqlCommand,connection);
    DataTable datatable = new DataTable();
    dap.Fill(datatable);
    return datatable;
}

【讨论】:

  • 你为什么分享这个链接? @SonerGönül
  • 正如@SonerGönül 所说,我可以走这条路,但我仍然想知道为什么DataTable.Load() 方法不能按预期工作,或者我只是做错了。
【解决方案3】:

使用SqlDataReaderDataAdapter,两者都可以。关闭连接后写return语句。试试看是否有效。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多