2013-02-23 63 views
-1

兩個方法我有這樣的方法:問題與調用數據訪問方法

public bool ActivateUser(string username, string key) 
     { 
      var user = this.GetUser(username, true); 

      if (user != null) 
      { 
       if (user.NewEmailKey == key) 
       { 
        string query = "usp_ActivateUser"; 
        using (SqlConnection conn = new SqlConnection(connectionString)) 
        { 
         using (SqlCommand cmd = new SqlCommand(query, conn)) 
         { 
          cmd.CommandType = CommandType.StoredProcedure; 
          cmd.Parameters.AddWithValue("@p_Username", username); 
          cmd.Parameters.AddWithValue("@p_LastModifiedDate", DateTime.Now); 

          conn.Open(); 

          using (SqlDataReader reader = cmd.ExecuteReader()) 
          { 
           cmd.ExecuteNonQuery(); 
           return true; 
          } 
         } 
        } 
       } 
       else 
        return false; 
      } 
      else 
       return false; 

     } 

正如你可以看到我打電話的getUser()方法首先獲取用戶和以後使用的數據的另一個數據庫調用。但有些事情出錯了。

There is already an open DataReader associated with this Command which must be closed first. 

這裏是得到用戶的方法:

public User GetUser(string username, bool nonMembershipUser) 
     { 
      string query = "usp_GetUser"; 
      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand(query, conn)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@p_Username", username); 
        conn.Open(); 

        using (SqlDataReader reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         {... 

回答

1

你的問題是在這裏。

using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      cmd.ExecuteNonQuery(); 
      return true; 
     } 

要調用cmd.ExecuteNonQuery()但該命令已經在使用此使用塊內的閱讀器。

由於您的代碼沒有真正做到讀者有意義,爲什麼不完全刪除該塊並致電cmd.ExecuteNonQuery()

+0

編碼整晚的事情必須出錯:)謝謝 – 1110 2013-02-23 13:22:57

1

爲什麼你在using聲明中做cmd.ExecuteReader(),然後cmd.ExecuteNonQuery();就在下一行?

爲什麼全部使用ExecuteReader(),因爲您僅僅是從數據庫調用返回而沒有檢查結果 - ExecuteNonQuery就足夠了。

1

這就是問題所在,在ActivateUser:

using (SqlDataReader reader = cmd.ExecuteReader()) 
          { 
           cmd.ExecuteNonQuery(); 
           return true; 
          } 

您無法打開SqlCommand對象上的閱讀器,然後執行該命令的objct另一個查詢,而不先關閉閱讀器 - 這不會發生直到最後一個「}」。 其實我不確定你在這種情況下甚至需要讀者 - 你是否可以從你的GetUser函數複製/粘貼?所有你應該需要的是

cmd.ExecuteNonQuery(); 
return true; 

而且,我會考慮包裝代碼來執行讀取,查詢,等進了一些功能,以便您可以重新使用它們。這是我作爲讀者的包裝通常使用:

public static DataTable ExecuteReader (string query,CommandType commType, params SqlParameter[] Paramerters) 
{ 
    try 
    { 
     using (SqlConnection conn = new SqlConnection("your connection string here") 
     { 
      conn.Open(); 
      using (SqlCommand comm = new SqlCommand(conn,query)) 
      { 
      conn.CommandType=commType; 
      if (Parameters!=null) comm.Parameters.AddRange(Parameters); 
      DataTable dt = new DataTable(); 
      using (SqlDataReader reader = comm.ExecuteReader()) 
      { 
       dt.Load(reader); 
      } 
      return dt; 
     }//end using command 
    }//end using connection 
} 
catch(Exception) 
{ 
     throw; 
} 
}//end function 

,你可以寫nonquery,nonreader等簡單包裝,也是如此。