SqlDataReader - 如何将当前行转换为字典

35

有没有一种简单的方法将SqlDataReader当前行的所有列转换为字典?

using (SqlDataReader opReader = command.ExecuteReader())
{
// Convert the current row to a dictionary
}

谢谢

5个回答

78

你可以使用 LINQ:

return Enumerable.Range(0, reader.FieldCount)
                 .ToDictionary(reader.GetName, reader.GetValue);

1
你的回复看起来很有趣,但我需要它用VB.NET编写,而且我不知道如何翻译最后一部分——.ToDictionary(reader.GetName, reader.GetValue)。有什么建议吗?谢谢。 - bzamfir
1
@bzamfir:你需要使用AddressOf - SLaks
5
我对跟风使用 LINQ 表达式有所戒备,但这个确实很出色。 - Phil Cooper
1
这是目前提出的最佳解决方案。 - Drew R
2
一个非常聪明的程序。 - Ibrahim ben Salah
显示剩余2条评论

28

有比这更简单的方法吗?

// 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));
}

我仍然不确定为什么您需要将一种类型的集合转换为另一种。


5
作为对你问题的回答:如果需要缓存结果,似乎更明智的做法是缓存字典副本。否则,你最终会有很多打开的读取器。 - Toad
2
如果您想要缓存结果,可以使用 DataTable。MyDataTable.Load(dr); - Cade Roux
@CadeRoux 一个 DataTable 会读取整个结果集,而不是单行,对吧? - Drew R
1
@CadeRoux 保存到字典中比保存到DataTable中快4-5倍。一个测试:http://lauteikkehn.blogspot.ro/2012/03/datatable-vs-list.html - Valentin
3
我不明白为什么人们在回答问题时会先询问“你为什么这样做?”或者“你问这个问题的原因是什么?”我们不知道提问者的具体情境。请您翻译上述英文句子。 - Simple Fellow

6

我在2016年3月9日遇到了这个问题,最终使用了SLaks所提供的答案。但是,我需要稍微修改一下:

dataRowDictionary = Enumerable.Range(0, reader.FieldCount).ToDictionary(i => reader.GetName(i), i=> reader.GetValue(i).ToString());

我从这个 StackOverflow 问题中找到了指导:将dataReader转换为Dictionary

这太棒了,正是我想做的。它还将 null 转换为空字符串。 - Dymas

0

GetValues方法接受并将所有值放入一维数组中。
这有帮助吗?


0

它已经是一个IDataRecord了。

这应该给你几乎与字典相同的访问权限(按键)。由于行通常不会有超过几个列,查找的性能应该没有太大差异。唯一重要的区别是“有效载荷”的类型,即使在那里,您的字典也必须使用对象作为值类型,因此我将优先考虑IDataRecord。


7
当您希望在释放连接后仍然可以使用查询结果时,这将非常有用。DataReader对象与创建它们的连接密切相关。 - sholsinger

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