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();
}
}
}
}
}
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
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
Rufen Sie Dispose nicht explizit auf, sondern verpacken Sie den Code mit (var cmw = new SqlCommand (...)). –