将查询的结果存储在字典中

时间:2011-12-21 02:22:29

标签: c# collections dictionary .net-2.0

我使用C#开发Windows移动应用程序时遇到问题,我尝试使用3个查询。 我想将所有结果查询收集到字典中。

我可以在没有循环的情况下收集它吗?

像这样我的代码:

string query= "select distinct nameProduct, price from product";
SqlCeCommand cmd = new SqlCeCommand(sql, dbConn);
Dictionary production = new Dictionary<string, int>();

如何从我的查询中设置此生产,因为我在一个进程中有3个这样的查询,并且数据超过10.000。

@John Saunders: 当我尝试这个时,我得到错误“{”行/列没有数据。“}”但实际上当我在sql server中尝试查询仍然运行良好时。行中的错误:production [(string)reader [“nameProduct”]] =(int)reader [“price”];

@Johnny: 不幸的是,这个项目在VS2005中构建,不支持union和join语句。

4 个答案:

答案 0 :(得分:4)

Dictionary production = new Dictionary<string, int>();
string query= "select distinct nameProduct, price from product";
using (SqlCeCommand cmd = new SqlCeCommand(sql, dbConn))
{
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            production[(string)reader["nameProduct"]] = (int)reader["price"];
        }
    }
}

没有循环。注意我还没有尝试过:

production =
    reader.Cast<IDataRecord>()
          .ToDictionary(
              record => (string)record["nameProduct"], 
              record => (int)record["price"]);

答案 1 :(得分:2)

这是从数据库中获取数据并在字典中存储数据的简单方法

Dictionary<int, string>emp = new Dictionary<int, string>();
OleDbCommand cmd = new OleDbCommand("select empId,Name from Employee where ORDER BY empId DESC", con);
OleDbDataReader dr = cmd.ExecuteReader();

if (dr.HasRows)
{
    while (dr.Read())
    {
         emp.Add(Convert.ToInt32(dr["empId"]), dr["Name"].ToString());                
    }                    
}

foreach (KeyValuePair<int, string> em in emp)
{
    Console.WriteLine(em.Key.ToString() + " = " + em.Value);
}

答案 2 :(得分:1)

您可以将DataTable(使用DataAdapter.Fill方法填充DataTable)结果转换为Dictionay。

string query= "select distinct nameProduct, price from product";
SqlCeConnection conn = new SqlCeConnection("Data Source = your file.sdf");

SqlCeCommand selectCmd = conn.CreateCommand();
selectCmd.CommandText = query;

SqlCeDataAdapter adp = new SqlCeDataAdapter(selectCmd);
DataTable dt=new DataTable();
adp.Fill(dt);

Dictionary<string, int> result = (from row in dt.AsEnumerable()
                          select new KeyValuePair<string, int>
                          (row.Field<string>("nameProduct"), row.Field<int>("price")))
                          .ToDictionary(p=>p.Key,p=>p.Value);

 foreach (var t in result)
  {
    Console.WriteLine(t.Key + " " + t.Value);
  }

答案 3 :(得分:0)

几点。

1.我认为您可以在查询中使用“union all”。 2.如果你有超过10000行记录,特别是在移动设备上,我建议你只加载你需要的数据,你可以在一个屏幕上显示,而不是全部显示。