C# DataTable未加载SqlDataReader

C# DataTable未加载SqlDataReader,c#,.net,datatable,sqldatareader,C#,.net,Datatable,Sqldatareader,运行此代码将返回一个空数据表。但是,通过reader.Read()循环并打印到调试控制台表明,读取器有数据,并打印预期的数据。此外,在调试期间展开reader对象时,hasRows为true,字段计数与返回的列数相符 这里也有类似的帖子 但答案基本上是,不要使用它,使用SqlDataAdapter。我更喜欢使用它,DataTable有一个加载方法,它采用IDataReaderDataTable.load(IDataReader)。我只是不知道为什么当我把它打印到调试窗口时,读卡器会工作,但当我把

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

这里也有类似的帖子
但答案基本上是,不要使用它,使用
SqlDataAdapter
。我更喜欢使用它,
DataTable
有一个加载方法,它采用IDataReader
DataTable.load(IDataReader)
。我只是不知道为什么当我把它打印到调试窗口时,读卡器会工作,但当我把它加载到
数据表时,读卡器就不工作了。我只是忽略了什么吗?

试着这样做,看看效果如何

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
对象的预览显示了
{}
,在我看来是空的。

然后,对象上有一个名为
ExtendedProperties
的属性,它的
Count=0
,这显然不是行计数,但我只是掩饰了一下,让
Count=0
卡在了我的脑袋里

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


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

使用
SqlDataReader
DataAdapter
,两者都可以工作。关闭连接后编写return语句。试试看它是否有效。

@SonerGönül我在SqlDataReader上没有看到填充方法如何使用
SqlDataAdapter
并使用它的
Fill
方法?@SonerGönül我可以使用
SqlDataAdapter
,但我只是好奇为什么数据表上的适当方法不起作用。。。SqlDataReader速度更快,我更愿意使用它。这里有一些关于差异的信息,我怀疑有什么区别-
DataTable.Load
在内部使用数据适配器:)使用
SqlDataReader
的所有这些“好处”只有在不使用读取器填充
DataTable
(这应该是意料之中的,因为数据适配器只是使用数据读取器填充数据表;如果您使用数据读取器手动填充数据表,您会从中得到什么好处?您正在做完全相同的事情。成本在数据表中。)。在不了解实际情况的情况下接受这样的建议时要小心-这会造成伤害。在任何情况下,
DataTable.Load
对我来说都很好。如果一切保持原样并使用数据适配器来填充表,那么它真的有效吗?您有多个结果集吗?该命令做什么?为什么要使用它共享此链接?@SonerGönülAs@SonerGönül说,我可以走这条路,但我仍然想知道为什么
DataTable.Load()
方法不能按预期工作,或者我只是做错了。那么你是如何修复错误的,你没有提到这一点,只是你注意到了而已
using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter dap = new SqlDataAdapter(sqlCommand,connection);
    DataTable datatable = new DataTable();
    dap.Fill(datatable);
    return datatable;
}