DataTable无法加载SqlDataReader

4
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 有一个加载方法,该方法需要一个 IDataReaderDataTable.Load(IDataReader)。我只是不知道为什么当我将它加载到 DataTable 中时,读取器工作不正常,但在打印它到调试窗口时它可以正常工作。我是不是忽略了什么?

1
@SonerGönül 我在SqlDataReader上没有看到Fill方法 https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx - asmithdev
使用SqlDataAdapter并使用它的Fill方法怎么样? - Soner Gönül
2
我怀疑没有区别 - DataTable.Load 无论如何都会在内部使用数据适配器 :) 链接中提到的那些使用 SqlDataReader 的“好处”仅适用于您不使用读取器来填充 DataTable 的情况(这应该是意料之外的,因为数据适配器只是使用数据读取器填充数据表;如果您手动使用数据读取器进行填充,那么您期望有什么好处呢?您正在做完全相同的事情。成本在数据表中)。小心接受这样的建议,而不了解实际发生的事情 - 这将会伤害你。 - Luaan
这篇文章中你的代码和这里有些小差异,但是试着去转换一下吧。 - terbubbs
1
无论如何,DataTable.Load 对我来说都很好用。如果您保持一切不变,使用数据适配器填充表格,它是否实际起作用?您是否有多个结果集?该命令是做什么的? - Luaan
显示剩余2条评论
3个回答

13
我发现我只是忽略了一些东西,实际上这根本不是问题。原始代码实际上运行良好。调试时DataTable对象的预览显示为{},看起来对我来说是空的。 enter image description here 然后对象上有一个名为ExtendedProperties的属性,它的Count = 0,显然不是行数,但我只是粗略地看过去,并且将Count = 0印象深刻。

enter image description here

如果你发现自己处于同样的情况,当鼠标悬停在对象上并展开Rows,你应该能够在其中看到行数。enter image description here 我被愚弄了...对不起,因为我的愚蠢,感谢大家的帮助。

2
那么你是如何修复这个错误的?你只提到了你注意到了什么,但没有提到具体的修复方法。 - Smith
哎呀...太可怕了。 - hungryMind

0

试着这样做,看看它是否有效...

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

1
https://dev59.com/oJLea4cB1Zd3GeqPyyyZ?noredirect=1#comment56418080_34338188 - Soner Gönül
你为什么分享这个链接?@SonerGönül - khaled4vokalz
正如@SonerGönül所说,我可以选择这种方法,但我仍然想知道为什么DataTable.Load()方法不能按预期工作,或者我是否做错了什么。 - asmithdev

0

使用 SqlDataReader 或者 DataAdapter,两者都可以。在关闭连接之后编写返回语句。尝试一下看是否可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接