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
有一个加载方法,它采用IDataReaderDataTable.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;
}