2017-05-05 1 views
0

Ich bekomme eine Ausnahme aufgerufen Es gibt bereits einen offenen Datenleser, der mit diesem Befehl verbunden ist, der zuerst geschlossen werden muss Google Ich habe versucht, MARS = True in der Verbindungszeichenfolge und auch alles in USING, aber es hat das Problem nicht gelöst. Ich bekomme eine Ausnahme in Zeile cm.ExecuteNonQuery();Es gibt bereits einen offenen Datenleser, der mit diesem Befehl verbunden ist, der zuerst geschlossen werden muss. Ausnahme

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

Nicht verwandt: Sie _need_, um Ihre Abfragen zu parametrisieren, anstatt String-Verkettung durchzuführen. Hier ist ein [relevanter Artikel, warum] (https://msdn.microsoft.com/en-us/library/ff648339.aspx) – MrZander

+2

Nun. Der Fehler scheint mir ziemlich klar zu sein. Sie müssen _dr.Close_ aufrufen, bevor Sie den letzten Aktualisierungsbefehl ausgeben. Aber wirklich Ihre Art, SQL-Befehle zu schreiben, ist sehr gefährlich. Fix es so schnell wie möglich mit Parametern. Abgesehen von SQL Injection, was wird Ihrer Meinung nach passieren, wenn Ihr Feld NOTE ein einfaches Zitat enthält? – Steve

+0

Rufen Sie Dispose nicht explizit auf, sondern verpacken Sie den Code mit (var cmw = new SqlCommand (...)). –

Antwort

1

In der zweiten Hälfte des Codes, haben Sie eine Schleife über cmd/dr und innerhalb dass Schleife verwenden Sie cmw mit ExecuteNonQuery. Das bedeutet, dass Sie versuchen, zwei Befehle gleichzeitig auszuführen. Da Sie die Schleife bereits abgeschlossen haben: Bewegen Sie einfach den Code außerhalb der using auf der dr.

Aber es sieht wie Sie könnten auch all dies in einer einzigen Rundreise mit besseren SQL.

+0

Schließen des Datenlesers löste das Problem für mich. – Naive

Verwandte Themen