2016-10-21 26 views
0

在一个程序,我一直在努力,有三个步骤来获取数据到一个已经创建了一个字典:C#填充字典直接从SqlDataReader的

  1. 执行SQL命令
  2. 拉那些结果成DataTable,然后
  3. DataTableDictionary

代码:

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

我的问题是,是否有可能“切掉中间人”,可以这么说,并将数据从SqlDataReater直接拖到字典?或者是否有必要先将它拉入DataTable?如果我想要做什么是可能的,有人可以发布代码给我试试吗?

非常感谢!

+0

试试这个:myDr.Read(); (myDr!= null) customerLookup.Add(myDr [“code”],myDr [“customerText”]); myDr.Read(); } – jdweng

回答

3

你可以通过阅读器返回的行中循环:

var customerLookup = new Dictionary<string, string>(); 
using (var reader = myLookup.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     customerLookup[(string)reader["code"]] = (string)reader["customerText"]; 
    } 
} 

你应该知道,如果有任何重复的代码,随后的码值将覆盖在字典以前的。如果您希望在这种情况下引发异常,您可以使用customerLookup.Add()

0

你不仅可以,但你绝对应该。正如你所展示的那样,代码显示了对.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)) 
    } 
}