C# OleDb Исключение "Не задано значение для одного или нескольких обязательных параметров" при попытке удалить из базы данных Access
У меня есть таблица с "SEMESTER, SUBJECT, OFFER, RESULT", где "SEMESTER" и "SUBJECT" - это ПЕРВИЧНЫЙ КЛЮЧ. Когда я использую запрос
"DELETE FROM Course_Information WHERE Semester = 1 AND Subject = 'CSE-414' ;
Он отлично работает в базе данных доступа, но я всегда получаю исключение, когда пытаюсь использовать его в своем коде C#.
Кроме того, это работает, если я использую "УДАЛИТЬ ИЗ 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);
}
4 ответа
Включите кавычки вокруг значения, которое вы получаете от 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
все строки в таблице будут удалены.
Вы проверяете значение VARCHAR из запроса SQL. Итак, вам нужно добавить '' к вашему запросу
исправление
string sql_query = "DELETE FROM Course_Information WHERE Semester = '" + this.textBox1.Text + "' AND Subject = '" + this.textBox2.Text + "' ;";
Если вы получили ту же ошибку для запроса "вставка", вы можете использовать этот метод для избежания исключения
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();
}
Изменили ли вы какие-либо имена полей? Я получил эту ошибку, когда использовал Access для изменения имени поля в моей базе данных. Старое название было «DisbursementType». Новое имя было «ExpenseType». Я использовал запрос с новым именем поля для заполнения набора данных, который работал нормально.
string sqlQuery = "select * from Finance WHERE ExpenseType = 'MISC'";
System.Data.OleDb.OleDbCommand obiwan = new System.Data.OleDb.OleDbCommand();
obiwan.CommandText = sqlQuery;
this.financeTableAdapter.Adapter.SelectCommand.CommandText = sqlQuery;
this.financeTableAdapter.Fill(homeFinanceDataSet.Finance);
Ошибка использования той же строки запроса для открытия набора записей.
string sqlQuery = "select * from Finance WHERE ExpenseType = 'MISC'";
string dbaseaddress = "";
ADODB.Recordset RS = new ADODB.Recordset();
if (openFileDialog1.ShowDialog()== DialogResult.OK)
{
dbaseaddress = openFileDialog1.FileName;
ADODB.Connection fc = new ADODB.Connection();
string str = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + dbaseaddress + ";" +
"Jet OLEDB:Database Password=" + "password" + ";";
fc.Open(str);
RS.Open(sqlQuery, fc, ADODB.CursorTypeEnum.adOpenStatic, &_
ADODB.LockTypeEnum.adLockOptimistic,0);
В последней строке выдается исключение: «System.Runtime.InteropServices.COMException: 'Нет значения для одного или нескольких обязательных параметров'».
Когда используется исходное имя поля, исключение не выдается.
string sqlQuery = "select * from Finance WHERE DisbursementType = 'MISC'";
string dbaseaddress = "";
ADODB.Recordset RS = new ADODB.Recordset();
if (openFileDialog1.ShowDialog()== DialogResult.OK)
{
dbaseaddress = openFileDialog1.FileName;
ADODB.Connection fc = new ADODB.Connection();
string str = "Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=" + dbaseaddress + ";" +
"Jet OLEDB:Database Password=" + "password" + ";";
fc.Open(str);
RS.Open(sqlQuery, fc, ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic,0);
MessageBox.Show(string.Format("{0}",RS.RecordCount));