SqlDataReader - 如何将当前行转换为字典
Posted
技术标签:
【中文标题】SqlDataReader - 如何将当前行转换为字典【英文标题】:SqlDataReader - How to convert the current row to a dictionary 【发布时间】:2009-05-26 21:51:12 【问题描述】:有没有一种简单的方法可以将 SqlDataReader 的当前行的所有列转换为字典?
using (SqlDataReader opReader = command.ExecuteReader())
// Convert the current row to a dictionary
谢谢
【问题讨论】:
【参考方案1】:您可以使用 LINQ:
return Enumerable.Range(0, reader.FieldCount)
.ToDictionary(reader.GetName, reader.GetValue);
【讨论】:
您的回复看起来很有趣,但我在 VB.NET 中需要它,而且我不知道如何翻译最后一部分 - .ToDictionary(reader.GetName, reader.GetValue)。有什么建议吗?谢谢 @bzamfir:你需要AddressOf
。
我对加入 linq-is-everything 的潮流持谨慎态度,但这太棒了。
这是迄今为止提出的最好的解决方案
真是太聪明了。【参考方案2】:
比这容易吗?:
// Need to read the row in, usually in a while ( opReader.Read ) loop...
opReader.Read();
// Convert current row into a dictionary
Dictionary<string, object> dict = new Dictionary<string, object>();
for( int lp = 0 ; lp < opReader.FieldCount ; lp++ )
dict.Add(opReader.GetName(lp), opReader.GetValue(lp));
我仍然不确定您为什么需要从一种集合类型到另一种集合的这种特殊转换。
【讨论】:
回答您的问题:如果需要缓存结果,缓存字典副本似乎更明智。否则你最终会得到很多开放的读者 @Toad 如果您想缓存结果,可以使用 DataTable。MyDataTable.Load(dr);
@CadeRoux 一个 DataTable 会读取整个结果集而不是单行吗?
@CadeRoux 保存到字典的速度比 DataTable 快 4-5 倍。一项测试:lauteikkehn.blogspot.ro/2012/03/datatable-vs-list.html
我不明白为什么,人们不是简单地回答,而是询问“你为什么要这样做?或者你为什么要问这个?”我们不知道有人问这个问题的实际场景是什么【参考方案3】:
我在 2016 年 3 月 9 日遇到了这个问题,最终使用了 SLaks 提供的答案。但是,我需要稍微修改一下:
dataRowDictionary = Enumerable.Range(0, reader.FieldCount).ToDictionary(i => reader.GetName(i), i=> reader.GetValue(i).ToString());
我从这个 *** 问题中找到了指导:convert dataReader to Dictionary
【讨论】:
这很棒,正是我想要做的。它还将空值转换为空字符串。【参考方案4】:它已经是IDataRecord
。
这应该为您提供与字典相同的访问权限(按键)。由于行通常不会有超过几列,因此查找的性能应该没有那么不同。唯一重要的区别是“有效负载”的类型,即使在那里你的字典也必须使用对象作为值类型,所以我给 IDataRecord 一个优势。
【讨论】:
当您希望在释放连接后查询结果可用时,这很有用。 DataReader 对象本质上与创建它们的连接相关联。【参考方案5】:GetValues 方法接受并放入一维数组中的所有值。 这有帮助吗?
【讨论】:
以上是关于SqlDataReader - 如何将当前行转换为字典的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 SQLDataReader 项是不是为 DateTime os String 类型值?
如何使用 SqlDataReader 获取位值并将其转换为布尔值?
C# - 无法将类型“IBM.Data.DB2.iSeries.iDB2DataReader”隐式转换为“System.Data.SqlClient.SqlDataReader”