C#直接从SqlDataReader填充字典

3

在我正在工作的一个程序中,获取数据并将其放入已创建的Dictionary中,需要三个步骤:

  1. 执行SQL命令
  2. 将结果提取到一个DataTable中,然后
  3. DataTable中的内容提取到Dictionary

代码:

var myDr = myLookup.ExecuteReader();
dt.Load(myDr);
customerLookup = dt.AsEnumerable()
    .ToDictionary(key => key.Field<string>("code"),
    value => value.Field<string>("customerText"));

我的问题是,能否直接从 SqlDataReader 中抽取数据到 Dictionaries 中,而不必通过中间 DataTable?如果我想做的是可能的,有没有人能为我发布一些代码供我尝试?
非常感谢!

尝试这个: myDr.Read(); while(myDr != null) { customerLookup.Add(myDr["code"], myDr["customerText"]); myDr.Read(); } - jdweng
3个回答

8
你可以通过循环遍历读取器返回的行来实现:
var customerLookup = new Dictionary<string, string>();
using (var reader = myLookup.ExecuteReader())
{
    while (reader.Read())
    {
        customerLookup[(string)reader["code"]] = (string)reader["customerText"];
    }
}

请注意,如果有重复的代码,则在字典中后续代码值将覆盖先前的代码值。如果您希望在这种情况下引发异常,可以使用customerLookup.Add()


2

不仅可以,而且你一定应该这样做。如你所示的代码,显示出了完全不了解.NET工作原理的情况。

我建议的一些代码可能会被认为是“过度”的,但它确实演示了一些最佳实践。

Dictionary<string, string> customerLookup = new Dictionary<string, string>();
using (var reader = myLookup.ExecuteReader())
{
    int ordinalCode = reader.GetOrdinal("code");
    int ordinalCustomerText = reader.GetOrdinal("customerText");
    while (reader.Read())
    {
        //this code assumes the values returned by the reader cannot be null
        customerLookup.Add(reader.GetString(ordinalCode), reader.GetString(ordinalCustomerText))
    }
}

1

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