2011-08-29 53 views
0

我的代碼引發錯誤重新打開SqlDataReader的

無效試圖調用時閱讀的讀者被關閉。

我使用SqlDataReader的讀取來自數據庫值,這是我的代碼:

while (rd.Read()) 
{ 
    string stateincharge = rd["stateincharge"].ToString(); 
    string email = rd["email"].ToString(); 
    cmd.Dispose(); 
    rd.Close(); 
    cmd = con.CreateCommand(); 
    cmd.CommandText = "str_procedure"; 
    cmd.Parameters.AddWithValue("@stateincharge", stateincharge); 
    cmd.CommandType = CommandType.StoredProcedure; 
    ad.SelectCommand = cmd; 
    ad.Fill(ds); 
    count = ds.Tables[0].Rows.Count; 
    DataTable dt = new DataTable(); 
} 

這將運行在ASP.NET循環代碼隱藏。

我的問題是,我想我需要關閉SqlDatReader,因爲顯示的錯誤。

如何在while循環結束時再次打開sqlDataReader?

+0

你能解釋一下你想做什麼嗎?我認爲你的理解混淆了。如果你能解釋一下,也許我們可以指出一個更好的方法。 –

+0

您在哪一行收到'關閉DataReader第一個錯誤'? – Waqas

+0

@ Wagas:ad.Fill(ds); – Roshan

回答

0

因爲您正在關閉while循環中的閱讀器,所以您必須刪除關閉閱讀器rd.Close();的行,然後嘗試再次訪問閱讀器。另外,我認爲如果您使用了新的SQL命令和新的適配器,您將不會收到此錯誤。

+1

使用新的連接適配器 – Roshan

2
// connection for reader 
using (SqlConnection connection1 = new SqlConnection(connectionString)) 
using (SqlCommand command1 = new connection1.CreateCommand()) 
{ 
    command1.CommandText = commandText1; 

    connection1.Open(); 
    using (SqlDataReader reader = command1.ExecuteReader()) 
    { 
     // fill table in loop 
     while (reader.Read()) 
     { 
      string stateincharge = reader["stateincharge"].ToString(); 
      string email = reader["email"].ToString(); 

      // connection for adapter 
      using (SqlConnection connection2 = new SqlConnection(connectionString)) 
      using (SqlCommand command2 = new connection2.CreateCommand()) 
      { 
       command2.CommandText = commandText2; 

       command2.Parameters.AddWithValue("@stateincharge", stateincharge); 
       command2.Parameters.AddWithValue("@email ", email); 

       connection2.Open(); 

       DataTable table = new DataTable(); 
       using (SqlDataApapter adapter = new SqlDataAdapter(command2)) 
       { 
        adapter.Fill(table); 
        // yield return table; 
       } 
      } 
     } 
    } 
} 
0

每個連接最多隻能有一個活動命令(其中包括「響應」,即閱讀器)。您試圖對數據庫執行嵌套調用,這要求您在循環之前完全加載數據(例如,將數據加載到DataTable之內),或者要求將第二個連接調用到str_procedure

0
while (rd.Read()) 
    { 
     string stateincharge = rd["stateincharge"].ToString(); 
     string email = rd["email"].ToString(); 
     cmd.Dispose(); 
     cmd = con.CreateCommand(); 
     cmd.CommandText = "str_procedure"; 
     cmd.Parameters.AddWithValue("@stateincharge", stateincharge); 
     cmd.CommandType = CommandType.StoredProcedure; 
     ad.SelectCommand = cmd; 
     ad.Fill(ds); 
     count = ds.Tables[0].Rows.Count; 
     DataTable dt = new DataTable(); 
} 
rd.Close(); 
+0

已經有一個開放的DataReader與該命令關聯,必須先關閉。 – Roshan