Pauline Agawin Ответов: 2

Executenonquery: свойство commandtext не было инициализировано'


Привет! у меня есть проблема с моим проектом, он работал утром, а потом теперь (вечером) его нет, и я не знаю, где проблема. вот мои коды, и я надеюсь, что вы, ребята, сможете мне в этом помочь. проблема гласит: "
System.InvalidOperationException: 'ExecuteNonQuery: CommandText property has not been initialized'


private void submitBtn_Click(object sender, EventArgs e)
        {
            con.Open();

            string a = "Accept";
            string b = "Reject";
            string queryUpdate1 = "";
            string queryUpdate2 = "";

            if (accptBtn.Checked)
            {
                if(type_rdonly.Text == "SL")
                {
                    if (ifEmployeeExist(con, emptime_rdonly.Text))
                    {
                        queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS ='" + a + "'WHERE [EMP_TIME] ='" + emptime_rdonly.Text + "'";
                    }
                        queryUpdate2 = string.Format("UPDATE LEAVE_ADMIN SET L_SPENT_SL = (L_SPENT_SL + 1), L_REM_SL = (L_REM_SL - 1)");
                }
                if (type_rdonly.Text == "VL")
                {
                    if (ifEmployeeExist(con, emptime_rdonly.Text))
                    {
                        queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS ='" + a + "'WHERE [EMP_TIME] ='" + emptime_rdonly.Text + "'";
                    }
                    queryUpdate2 = string.Format("UPDATE LEAVE_ADMIN SET L_SPENT_VL = (L_SPENT_VL + 1),L_REM_VL = (L_REM_VL - 1)");
                }
                SqlCommand cmd1 = new SqlCommand(queryUpdate1, con);
                SqlCommand cmd2 = new SqlCommand(queryUpdate2, con);
                cmd1.ExecuteNonQuery();
                cmd2.ExecuteNonQuery();


Что я уже пробовал:

я проверил свою вторую спину, и она была такой же.

F-ES Sitecore

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

Pauline Agawin

Привет! можем ли мы поговорить по электронной почте, чтобы я мог показать вам свои материалы? ошибка гласит:

cmd 1 = system.data.sqlclient.sqlcommand
cmd 2 = system.data.sqlclient.sqlcommand
кон = система.данных.sqlclient как.команда sqlcommand
queryUpdate2 = "UPDATE [LEAVE_ADMIN] SET L_SPENT_SL = (L_SPENT_SL + 1), L_REM_SL = (L_REM_SL - 1)"


2 Ответов

Рейтинг:
2

MadMyche

Все по порядку... Ваш код уязвим для атак SQL-инъекций. Это происходит потому, что вы объединяете постоянные строки и входные данные конечного пользователя. Эта уязвимость известна уже более 20 лет и до сих пор входит в топ-10 активных методов взлома веб-сайтов.
Способ исправить это будет использовать Parameters для запроса. Помимо устранения уязвимости, это также позволит автоматический тип параметры основаны на присвоенном типе переменной - если вы дадите ей текст, она позаботится о одинарных кавычках или других идентификаторах, необходимых типу данных или типу подключенной базы данных. Недостатком является то, что если у вас есть номер, вы должны убедиться, что он имеет правильный тип, поэтому, если он исходит из текстового поля, убедитесь, что он переведен в соответствующий тип.
В вашем текущем коде нужно изменить только несколько строк

if(type_rdonly.Text == "SL")
{
  if (ifEmployeeExist(con, emptime_rdonly.Text))
  {
    // queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS ='" + a + "'WHERE [EMP_TIME] ='" + emptime_rdonly.Text + "'";
    queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS = @EmpStatus WHERE [EMP_TIME] = @EmpTime";
  }
  queryUpdate2 = "UPDATE LEAVE_ADMIN SET L_SPENT_SL = (L_SPENT_SL + 1), L_REM_SL = (L_REM_SL - 1)";
}
if (type_rdonly.Text == "VL")
{
   if (ifEmployeeExist(con, emptime_rdonly.Text))
   {
     // queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS ='" + a + "'WHERE [EMP_TIME] ='" + emptime_rdonly.Text + "'";
     queryUpdate1 = @"UPDATE [LEAVE_EMP] SET EMP_STATUS = @EmpStatus WHERE [EMP_TIME] = @EmpTime ";
   }
   queryUpdate2 = "UPDATE LEAVE_ADMIN SET L_SPENT_VL = (L_SPENT_VL + 1),L_REM_VL = (L_REM_VL - 1)";
}

SqlCommand cmd1 = new SqlCommand(queryUpdate1, con);
// new lines for parameters
cmd1.Parameters.AddWithValue("@EmpStatus", 1);
cmd1.Parameters.AddWithValue("@EmpTime", emptime_rdonly.Text);

При переходе к параметрам я заметил отсутствие пробела между одинарными кавычками и предложением WHERE в запросе #1
Я также отредактировал запрос № 2, так как его не нужно было завернуть в string.Format()

Попробуйте это сделать, и если у вас все еще есть проблемы, пожалуйста, попробуйте устранить неполадки и определить, какая команда не работает; это облегчает получение разрешения


Pauline Agawin

Привет! спасибо за ответ. я новичок в sql, и наш профессор не учил нас о хранимых процедурах, но я попробую ваше предложение! я свяжусь с вами как можно скорее. Спасибо!

MadMyche

Это все еще TSQL, никаких хранимых процедур не требуется

Pauline Agawin

где вы взяли @EmpTime и @EmpStatus?

MadMyche

Все те имена, которые я выбрал, чтобы использовать, когда я редактировал "queryUpdate1".

Pauline Agawin

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

MadMyche

Для чего нужны эти ценности type_rdonly.Текст, один, и emptime_rdonly.Текст

Pauline Agawin

значения взяты из datagrivd, type_Rdonly = SL или VL, emptime-это время, в которое пользователь запросил отпуск

MadMyche

Хорошо, но каковы значения переменных, когда возникает ошибка? Вы должны использовать dbe с помощью отладчика и шагать через строку кода lne be

Pauline Agawin

Привет! поэтому я сделал некоторую отладку, но queryupdate1 не обновляется. моя цель - обновить ожидание, чтобы принять или отклонить. вот что я сделал сейчас.

если (!строка.IsNullOrEmpty(queryUpdate1))
{
cmd1.Свойства commandtext = queryUpdate1;
cmd1.Метод executenonquery();
}
против.Закрывать();

Рейтинг:
1

OriginalGriff

Существует такой путь через ваш код, что либо один, либо оба из них queryUpdate1и queryUpdate2 все еще может быть пустой строкой после if условия: в частности, если typerdonly.Text это не "SL" или "VL", или если один из внутренних if условия терпят неудачу.

Вам нужно будет либо использовать отладчик, чтобы точно узнать, что происходит, либо добавить код журнала, чтобы точно записать то, что произошло для анализа после возникновения проблемы.

Затем вы можете посмотреть назад в своем коде, чтобы выяснить, почему значения не такие, как вы ожидаете.

Извините, но мы ничего не можем сделать для вас!

Да, и сделайте себе одолжение: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?


Pauline Agawin

Привет! спасибо за ответ. я новичок в sql, и наш профессор не учил нас о хранимых процедурах, но я попробую ваше предложение! Спасибо!