2011-06-09 26 views
0

我有一個C#的問題,我有一個SqlDataReader的函數和另一個SqlCommand的類(第一個只是爲了讀取數據庫的值,第二個是INSERT,UPDATE,DELETE ...在同一個數據庫中)。在一個類中有多個SqlDataReader和SqlCommand的問題

問題是,對於代碼的第一部分(登錄),我必須搜索Active Directory中的值(它的工作原理),然後我必須查看用戶是否在我自己的DB中擁有用戶名和密碼(它的工作原理),然後,如果用戶不在數據庫中,那麼我必須創建它並獲取ID,如果它已經創建,那麼我只需要獲取ID。

的問題是,我得到這個消息:

出現InvalidOperationException是 未處理由用戶代碼

已經存在與此命令,誰是 必須先關閉相關聯的打開的DataReader 。

有代碼:

Class.cs:

private static string MyConnectionString = "THIS IS MY CONNECTION"; 
    private SqlConnection MyConnection = new SqlConnection(MyConnectionString); 
    public SqlCommand MyCommand = new SqlCommand(); 
    public SqlDataReader MyReader = null; 

    public void DBMyReader(String SqlQuery) 
    { 
     if (MyConnection.State != ConnectionState.Open) 
      MyConnection.Open(); 

     MyCommand.Connection = MyConnection; 
     MyCommand.CommandText = SqlQuery; 
     MyReader = MyCommand.ExecuteReader(CommandBehavior.CloseConnection); 
    } 

    public void DBMyUpdate(String SqlQuery) 
    { 
     if (MyConnection.State != ConnectionState.Open) 
      MyConnection.Open(); 

     var cmdTest = new SqlCommand(); 

     cmdTest.Connection = MyConnection; 
     cmdTest.CommandText = SqlQuery; 
     cmdTest.ExecuteNonQuery(); 
    } 

    public void DBMyInsert(String SqlQuery) 
    { 
     DBMyUpdate(SqlQuery); 
    } 

** Login.aspx.cs:**

    MyClass.DBMyReader("SELECT util_codi,util_logi,util_nome FROM Tgep_util WHERE util_logi='" 
          + Session["username"].ToString() + "'"); 
      MyClass.MyReader.Read(); 

      if (!MyClass.MyReader.HasRows) 
      { 
       MyClass.MyReader.Close(); 
       MyClass.DBMyInsert("INSERT INTO Tgep_util(util_logi,util_nome) " 
          + "VALUES ('" + Session["username"].ToString() + "','" + Session["nome"].ToString() + "')"); 
      } 

      MyClass.DBMyReader("SELECT util_codi,util_logi,util_nome FROM Tgep_util WHERE util_logi='" 
      + Session["username"].ToString() + "'"); 

      MyClass.MyReader.Read(); 

      Session["user_id"] = MyClass.MyReader["util_codi"].ToString(); 

      Response.Redirect("FRM_Principal.aspx"); 

編輯:更新的代碼(現在運作)

回答

3

錯誤的含義正是它所說的。您已經加載了SQLCommand並開始讀取行,現在正在嘗試執行插入操作。您需要先關閉該閱讀器,或使用新的命令。

在DBMyUpdate

功能,您可以只創建一個新的命令:

public void DBMyUpdate(String SqlQuery) 
{ 
    if (MyConnection.State != ConnectionState.Open) 
     MyConnection.Open(); 
    var cmdUpdate = new SqlCommand(); 

    cmdUpdate.Connection = MyConnection; 
    cmdUpdate.CommandText = SqlQuery; 
    cmdUpdate.ExecuteNonQuery(CommandBehavior.CloseConnection); 
} 

編輯:根據意見,這個答案,它需要使用單獨的連接,這似乎奇/不正確。

+0

嗨,謝謝你的幫助。問題是,如果我關閉閱讀器,我必須開始另一個時間查詢,我不知道它是否非常有效...是否有解決方案tu解決問題只使用classe? – aliasbody 2011-06-09 15:44:24

+0

@aliasbody我剛剛添加了一種方法來更改您的DBMyUpdate函數,以使用不應與現有讀者衝突的新命令。 – Fosco 2011-06-09 15:45:57

+0

直到代碼正常工作之前,不要擔心效率問題。你不想要快速破碎的代碼。 – 2011-06-09 15:46:05

0

對於用於插入的insert/update,您不能使用相同的DataReader。在將其他命令與DataReader關聯之前,您必須先關閉DataReader

+0

但是當我試圖關閉閱讀器類(所以動作是自動的),然後我得到一個錯誤,說沒有連接打開更新功能:S ... – aliasbody 2011-06-09 15:51:40