2011-12-21 14 views
1

私は3つのクエリで動作しようとしているC#を使用してWindowsモバイルアプリケーションを開発するための問題があります。 すべての結果クエリを辞書に集めたいと思います。辞書のクエリの結果を格納

ループせずに収集できますか?この私のコードのような

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

がどのように私は私のクエリから、この生産を設定することができ、becausei 1つのプロセスでは、このような3クエリを持っており、データがより10.000です。

@ジョン・サンダース: これを試してみると、「{"行/列のデータはありません。"} "実際にはまだSQLサーバでうまく動作しています。プロダクション[(string)reader ["nameProduct"]] =(int)reader ["price"];

@Johnny: このプロジェクトはVS2005でビルドされており、unionとjoinステートメントをサポートしていません。

+1

データベースとデータ格納からデータを取得するための簡単な方法であるが、別の何かを把握するために10Kの時間だ場合 –

+0

非常に不明瞭です。 – Will

+0

どのように考えますか(a、11.0)(a、12.0) – shenhengbin

答えて

2
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"]); 
+0

OPをループせずに実行できる場合は、OP _asks_。 –

+0

ループを使わずに行うことはできませんが、ループを内部で非表示にすることはできます。 'ToDictionary()' – Sjoerd

+1

Whileはループであり、ToDictionaryも同様です。正解は「いいえ、これはできません」です。あなたのフルーツボウルから3つのリンゴを取得する唯一の方法は、カウンターに歩いて、それらを数え、オレンジとバナナを除外し、3つのリンゴをつかむことです。人間はそれを考えずに3つのリンゴを知っているので、これは大きな問題ではないようです。しかし、カウントと排除のプロセスは潜在的なレベルでさえも起こる必要があります。あなたはそれを避けることはできませんし、すべてのステップを経ることなくあなたの手に3つのリンゴを実現することはできません。 – Krythic

1

あなたはDataTableの変換(のDataTableを埋めるためにDataAdapter.Fillメソッドを使用する)こと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); 
    } 
+0

私はこれを試してみると、エラー "{"行/列のデータはありません。 "}" しかし、実際にはまだSQL Serverでクエリを実行しようとするとうまく動作しています。 行内のエラー: production [(文字列)reader ["nameProduct"]] =(int)reader ["price"]; – indi60

0

いくつかの点。

1.私はあなたの質問に "union all"を使うことができると思います。 2.特にレコードの行が10000を超える場合は、必要なデータだけをロードし、すべてを読み込むのではなく、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); 
} 
関連する問題