C# OleDb Exception Не задано значение для одного или нескольких обязательных параметров при попытке удалить из базы данных Access

У меня есть таблица с «СЕМЕСТР, ТЕМА, ПРЕДЛОЖЕНИЕ, РЕЗУЛЬТАТ», где «СЕМЕСТР» и «ТЕМА» - ПЕРВИЧНЫЙ КЛЮЧ. Когда я использую запрос

"DELETE FROM Course_Information WHERE Semester = 1 AND Subject = 'CSE-414' ;

Он отлично работает в базе данных доступа, но я всегда получаю исключение, когда пытаюсь использовать его в своем коде С#.

Более того, это работает, если я использую «УДАЛИТЬ ИЗ Course_Information WHERE Semester = 1;

Я хочу использовать как «SUBJECT», так и «SEMESTER» в условии WHERE (поскольку в одном семестре могут быть разные предметы)

Смотрите мой код,

connection_string = aConnection.return_connectionString(connection_string);
            string sql_query = "DELETE FROM Course_Information WHERE Semester = " + this.textBox1.Text + " AND Subject = " + this.textBox2.Text + " ;";

            OleDbConnection connect = new OleDbConnection(connection_string);
            OleDbCommand command = new OleDbCommand(sql_query, connect);
            try
            {
                connect.Open();
                OleDbDataReader reader = command.ExecuteReader();
                MessageBox.Show("Delete Successful!");
                connect.Close();
                UpdateDatabase();
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

person user2594788    schedule 07.08.2013    source источник


Ответы (2)


Заключите в кавычки значение, полученное от this.textBox2.Text, как в рабочем примере запроса.

" AND Subject = '" + this.textBox2.Text + "';";

Представьте, что this.textBox2.Text содержит текст foo. Без добавления этих кавычек в предложение WHERE механизм базы данных увидит ... WHERE Semester = 1 AND Subject = foo, но ничего не может найти в источнике данных с именем foo, поэтому предполагает, что это должен быть параметр. Вам нужны кавычки, чтобы сигнализировать механизму БД, что это строковое литеральное значение, 'foo'.

На самом деле, если вы переключитесь на запрос с параметрами, вы сможете избежать проблем такого типа, потому что вам не нужно будет возиться с этими кавычками в выражении DELETE. Кроме того, запрос с параметрами защитит вас от SQL-инъекций. Если злоумышленник сможет ввести ' ИЛИ ​​'a' = 'a в this.textBox2.Text, все строки в таблице будут удалены.

person HansUp    schedule 07.08.2013
comment
ОНО РАБОТАЕТ! :D Не могу в это поверить только из-за того, что это не сработало! Большое спасибо! - person user2594788; 08.08.2013
comment
Тем не менее рассмотрите возможность переключения на предложенные параметры. С помощью этого кода вы открываете свою базу данных для каждого пользователя вашего приложения. - person Linky; 08.08.2013

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

string sqlQuery = "INSERT into EndResultOfTestCases(IDsOfCases,TestCaseName,ResultCase,ResultLog) VALUES(@ids, @casename, @results, @logs)";

        connection = new OleDbConnection(connectionStringToDB);
        command = new OleDbCommand(sqlQuery, connection);
        command.Parameters.AddWithValue("@ids",IDs);
        command.Parameters.AddWithValue("@casename", CaseName);
        command.Parameters.AddWithValue("@results", resultOfCase);
        command.Parameters.AddWithValue("@logs", logs);
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
    }
person AliMusa    schedule 14.12.2016