2017-05-05 15 views
0

例外が発生しています既に開いているデータリーダーがあります。このコマンドに関連付けられています。 Google私は、接続文字列でMARS = trueを使用しようとしましたが、USING内のすべてを保持しましたが、問題は解決しませんでした。 私は行内で例外を受け取ります cm.ExecuteNonQuery();コードの後半でこのコマンドに関連付けられている開いているデータリーダーが既にあります。最初に閉じる必要があります。例外

public void UpdateActionSchedule(string actionScheduleKey, string note, string PEOPLE_CODE_ID) 
{ 

    using (SqlConnection con = new SqlConnection("server=123; database=abc; user id=qwe; password=qwe;")) 
    { 
     con.Open(); 

     if (note == "" || note == null) 
     { 
      string UPDATE_COMPLETE = String.Format("UPDATE ACTIONSCHEDULE SET EXECUTION_DATE = '" + DateTime.Now + "', COMPLETED = 'Y', REVISION_OPID='WFLOW' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'"); 
      SqlCommand cd = new SqlCommand(UPDATE_COMPLETE, con); 
      cd.ExecuteNonQuery(); 
      cd.Dispose(); 
     } 
     else 
     { 
      string oriNote = ""; 
      string GET_NOTE = String.Format("SELECT NOTE FROM ACTIONSCHEDULE WHERE people_org_code_id='{0}' and UNIQUE_KEY='{1}'", PEOPLE_CODE_ID, actionScheduleKey); 
      using (SqlCommand cmd = new SqlCommand(GET_NOTE, con)) 
      { 
       // SqlDataReader dr = cmd.ExecuteReader(); 
       using (SqlDataReader dr = cmd.ExecuteReader()) 
       { 
        if (dr.HasRows) 
        { 
         while (dr.Read()) 
         { 
          oriNote = dr["NOTE"].ToString(); 
         } 

         note = oriNote + " " + note; 
        } 

        //string UPDATE = String.Format("UPDATE ACTIONSCHEDULE SET Note = '" + note + "' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'"); 
        //SqlCommand cm = new SqlCommand(UPDATE, con); 
        //cm.ExecuteNonQuery(); 
        //cm.Dispose(); 

        string UPDATE_COMPLETE = String.Format("UPDATE ACTIONSCHEDULE SET EXECUTION_DATE = '" + DateTime.Now + "',Note = '" + note + "', COMPLETED = 'Y', REVISION_OPID='WFLOW' where UNIQUE_KEY = '" + actionScheduleKey + "' and people_org_code_id='" + PEOPLE_CODE_ID + "'"); 
        SqlCommand cmw = new SqlCommand(UPDATE_COMPLETE, con); 

        cmw.ExecuteNonQuery(); 

        cmw.Dispose(); 
       } 
      } 
     } 
    } 
} 
+2

関連性がありません:文字列連結を実行する代わりにクエリをパラメータ化する必要があります。ここに[関連記事は](https://msdn.microsoft.com/en-us/library/ff648339.aspx) – MrZander

+2

です。エラーは私には明らかです。最後の更新コマンドを発行する前に_dr.Close_を呼び出す必要があります。しかし、実際にSQLコマンドを書くあなたの方法は非常に危険です。パラメータを使ってできるだけ早く修正してください。 SQLインジェクションとは別に、あなたのフィールドNOTEに一重引用符が含まれているとどうなりますか? – Steve

+0

また、Disposeを明示的に呼び出さずに、(var cmw = new SqlCommand(...))を使用してコードをラップします。 –

答えて

1

、あなたはExecuteNonQuerycmwを使用し、cmd/dr以上のループを持っている、と内部そのループ。つまり、一度に2つのコマンドを実行しようとしています。既にループを完了しているので、のコードをusingdrに移動してください。

しかし、のように見えますが、このすべてをより良いSQLを使用して1回の往復で行うこともできます。

+0

データリーダーを閉じることが私の問題を解決してくれてありがとう。 – Naive

関連する問題