С этой командой уже связано открытое средство чтения данных, которое необходимо сначала закрыть Исключение

Я получаю исключение под названием «С этой командой уже есть открытое средство чтения данных, которое должно быть закрыто в первую очередь». Я попытался найти решение в Google. т решил проблему. я получаю исключение в строке 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();
                }
            }
        }
    }
}

person Naive    schedule 05.05.2017    source источник
comment
Несвязанный: вам нужно параметризовать запросы вместо объединения строк. Вот соответствующая статья о том, почему   -  person MrZander    schedule 05.05.2017
comment
Хорошо. ошибка кажется мне довольно ясной. Вам необходимо вызвать dr.Close перед выполнением последней команды обновления. Но на самом деле ваш способ написания sql-команд очень опасен. Исправьте это как можно скорее с параметрами. Помимо SQL-инъекций, как вы думаете, что произойдет, если ваше поле NOTE будет содержать одинарную кавычку?   -  person Steve    schedule 05.05.2017
comment
Также не вызывайте Dispose явно — скорее оберните свой код внутри using(var cmw = new SqlCommand(...)) .   -  person Ondrej Svejdar    schedule 05.05.2017
comment
@Steve dr.Close() мне понравилась проблема, я попытаюсь использовать параметры, я новичок в кодировании и склоняюсь к просмотру видео на YouTube, спасибо за помощь, это дает исключение Незакрытые кавычки после строки символов ''. И я не знаю, как ставить +1 к комментариям, иначе я бы дал вам. Спасибо за помощь   -  person Naive    schedule 05.05.2017


Ответы (1)


Во второй половине кода у вас есть цикл над cmd/dr, и внутри этого цикла вы используете cmw с ExecuteNonQuery. Это означает, что вы пытаетесь выполнить две команды одновременно. Поскольку вы уже завершили цикл, просто переместите этот код за пределы using на dr.

Однако похоже, что вы могли бы сделать все это за одно обращение с улучшенным SQL.

person Marc Gravell    schedule 05.05.2017