5

以下のコードでネストされた SqlDataReader を使用したかったのですが、作成できませんでした。コードで「System.InvalidOperationException: このコマンドに関連付けられた開いている DataReader が既にあり、最初に閉じる必要があります」というメッセージが表示されます。助言がありますか

            c = "select user_Reps.rep_key,Officers.Officer_Name from user_Reps left join Officers on user_Reps.rep_key = Officers.Officer_code where [user_key]="+userCode;
            if (c == null)
                c = sr.ReadToEnd();
            try
            {

                SqlCommand cmd = new SqlCommand(c, cn);
                cn.Open();
                SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
                SqlDataReader rdr2;
                while (rdr.Read())
                {
                    string c2 = "select Active_Clients.Clients_code,Active_Clients.Clients_Name,Active_Clients.Geo_code  from Active_Clients where Active_Clients.[Officer_code] =" + rdr.GetValue(0) + " order by Clients_Name";
                    SqlCommand cmd2 = new SqlCommand(c2, cn);

                    rdr2 = cmd2.ExecuteReader(CommandBehavior.CloseConnection);


                    Dictionary<string, object> d = new Dictionary<string, object>(rdr.FieldCount+rdr2.FieldCount);
                    while (rdr2.Read())
                    {
                        int i = 0;
                        for (; i < rdr.FieldCount; i++)
                        {
                            d[rdr.GetName(i)] = rdr.GetValue(i);
                        }

                        for (; i < rdr2.FieldCount; i++)
                        {
                            d[rdr2.GetName(i)] = rdr2.GetValue(i);
                        }

                        list.Add(d);
                    }




                    rdr2.Close();

                    //list.Add(d);
                }
                JavaScriptSerializer j = new JavaScriptSerializer();
                Response.Write(j.Serialize(list.ToArray()));

            }
4

3 に答える 3

17

エラー メッセージは少し誤解を招きます。接続文字列に含まれていない限りMultipleActiveResultSets=True、接続ごとにアクティブな結果セットを 1 つだけ持つことができます。すべてのリーダーが独自の個別の SqlCommand オブジェクトを持っている場合、これは依然として当てはまります。

于 2012-06-01T16:45:13.873 に答える
5

同じ接続で同時に 2 つの DataReader を開くことはできません。

この問題の一般的な解決策は、次の DataReader を開く前に、最初の DataReader の内容を DataTable または List<> にロードすることです。ネストされたクエリの新しい接続を開くこともできます。

編集または、@Mithrandir が述べたように、接続文字列で MultipleActiveResultSets=true を使用できます。

于 2012-06-01T16:46:30.900 に答える
1

SQL Server バージョン 2005 以降にあると仮定すると、複数のアクティブな結果セット (MARS) を有効にするとうまくいくはずです。http://msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx . MARS がオプションでない場合は、2 番目のコマンドに対して別の接続を開く必要があります。

于 2012-06-01T16:49:18.253 に答える