Необходимо объявить скалярную переменную. Ошибка

Рейтинг: 0Ответов: 1Опубликовано: 20.05.2023

Есть программа, которая должна обновлять данные в базе данных.

            int index = listBox2.SelectedIndex;

            var cmd = new OleDbCommand();
            cmd.CommandType = CommandType.Text;

            cmd.CommandText = "UPDATE task SET " +
                "[task_name] = @task_name," +
                "[task_desctiption] = @task_desctiption," +
                "[task_date] = @task_date," +
                "[task_last_update_date] = @task_last_update_date" +
                "WHERE id = @id";

            cmd.Parameters.Add("@id", OleDbType.Integer).Value = index;
            cmd.Parameters.Add("@task_name", OleDbType.VarChar, 50).Value = taskNameT.Text;
            cmd.Parameters.Add("@task_desctiption", OleDbType.VarChar, 500).Value = taskDescriptionT.Text;
            cmd.Parameters.Add("@task_date", OleDbType.Date).Value = DateTime.Parse(taskDateT.Text);
            cmd.Parameters.Add("@task_last_update_date", OleDbType.Date).Value = DateTime.Now;
            
            cmd.Connection = connection;
            connection.Open();
            cmd.ExecuteNonQuery();
            {
                MessageBox.Show("Update Success!");
                backBtn.PerformClick();
            }
            connection.Close();

Однако при выполенении возникает ошибка "Необходибо объявить скалярную переменную @task_name". Поискал в интернете, но ни один из варинатов не помогает. Основной проблемой все описывали несоотвествие типов данных либо же объявление параметров через .AddWithValue. Изменил, но все равно не работает. Не хотелось бы дублировать вопрос, ибо подобных вопросов много, но ни одно из решений не помогло. Поэтому я тут.

Ответы

▲ 0Принят

Насколько я понял, OleDbCommand не поддерживает именованные параметры в запросе.

The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example: SELECT * FROM Customers WHERE CustomerID = ?

Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.

Поэтому только через порядок следования.

cmd.CommandText = "UPDATE task SET " +
                  "[task_name] = ?," +
                  "[task_desctiption] = ?," +
                  "[task_date] = ?," +
                  "[task_last_update_date] = ? " +
                  "WHERE id = ?";

// порядок, в котором добавлены параметры, должен соответствовать порядку знаков вопроса в запросе
cmd.Parameters.Add("@task_name", OleDbType.VarChar, 50).Value = taskNameT.Text;
cmd.Parameters.Add("@task_desctiption", OleDbType.VarChar, 500).Value = taskDescriptionT.Text;
cmd.Parameters.Add("@task_date", OleDbType.Date).Value = DateTime.Parse(taskDateT.Text);
cmd.Parameters.Add("@task_last_update_date", OleDbType.Date).Value = DateTime.Now;
cmd.Parameters.Add("@id", OleDbType.Integer).Value = index;

Имена параметров в при их создании при этом игнорируются и могут быть любые.