2016-04-27 40 views
-1

私はC#のWindowsアプリケーションを実行していて、データレアを使用しようとするとエラーメッセージが表示されます。エラーメッセージは次のとおりです。読み取り中にC#リーダーが閉じられていますか?

"リーダーが閉じているときにCheckDataIsReadyを呼び出す呼び出しが無効です。"

"while"ループに入るまで、コードが正常に機能する停止点と鋸を使用しました。内部に入ると、エラーメッセージが表示されます。

私は以前の読者を閉じずにそれをやろうとしましたが、メッセージは「既に開かれている読者があります」などに変更されました。

conn = new SqlConnection(DBConnectionString); 
SqlCommand select_cmd = new SqlCommand("SELECT usrRealname, usrIsowner FROM tblUSERS WHERE usrNum = " + UserID, conn); 
SqlCommand select_orders = new SqlCommand("SELECT orderNum, orderBy, orderShipadrs, orderDate, orderTotal FROM tblOrders WHERE orderDeliveryDate is NULL AND fkorderTakenbyusrnum = " + UserID, conn); 
conn.Open(); 
SqlDataReader dr = select_cmd.ExecuteReader(); 
dr.Read(); 
CurrentUser User = new CurrentUser(Convert.ToString(dr[0]), UserID, Convert.ToBoolean(dr[1])); 
DetailsLabel.Text = String.Format("Welcome {0}, ID number {1}. {2}", User.getname, UserID, User.getOwner); 
dr.Close(); 
SqlDataReader orders = select_orders.ExecuteReader(); 
while (orders.Read()) 
{ 
UnfulfilledOrders CurrentOrder = new UnfulfilledOrders(Convert.ToInt32(dr[0]), Convert.ToString(dr[1]), Convert.ToString(dr[2]), Convert.ToString(dr[3]), Convert.ToInt32(dr[4])); 
OrderList.Items.Add(CurrentOrder); 
} 

私は何をしようとしているのだが、リストボックス(オーダーリスト)にオブジェクトをクラス(UnfulfilledOrders)を追加入力である:

は、ここでは、コードです。

私に不満を抱かせるものは、同じアプリケーションで以前のフォームでこのようなwhileループを使用していて、そこではうまくいきました。 私は本当に何が間違っているのか分かりません。 コードをtwikingして特定の部分を追加または削除しましたが、何も動作していないようです。

+2

明らかにクローズドリーダー 'dr.Close()から読み取り中です。 .... dr [0] '、...あなたは何をすると思いますか? –

答えて

1

あなたの問題は、whileループでorders [0]の代わりにdr [0]を使用していることです。これは、SqlDataReader drから値を取得しようとしています。

このような混乱を避けるための良い方法は、データブロックを使用ブロックに作成することです。

using (var dr = select_cmd.ExecuteReader()) 
{ 
    //your code here 
    dr.Close(); 
} 

その後、

using (var orders = select_orders.ExecuteReader()) 
{ 
    // your code here 
    orders.Close(); 
} 

VSはあなたにそれが存在しないというエラーを与えるので、これは誤って間違ったリーダーを参照するからあなたを防止するであろう。

+0

Wooooooooooooowそれは私の愚かだった... 私は一度に複数のdatareaderを扱うことに慣れていない。通常は、先生が私たちに協力してくれたデフォルトの "dr"を使用します。とにかく、それは本当に問題を解決しました。答えとしてマークします。 多くのことがあります! –

1

あなたのコード:

dr.Close(); //<-- dr closed 
SqlDataReader orders = select_orders.ExecuteReader(); // <-- Reader is "orders" here 
while (orders.Read()) 
{ 
UnfulfilledOrders CurrentOrder = new UnfulfilledOrders(Convert.ToInt32(dr[0]), Convert.ToString(dr[1]),  Convert.ToString(dr[2]), Convert.ToString(dr[3]), Convert.ToInt32(dr[4])); 
OrderList.Items.Add(CurrentOrder); 
} 

DRがあなたの代わりに "DR" の "注文" を意味するか、以前に閉鎖されましたか?

関連する問題