尝试从Access数据库中删除时,C#OleDbexception“没有给出一个或多个必需参数的值”

我有一张桌子上有“SEMESTER,SUBJECT,OFFER,RESULT”,其中“SEMESTER”和“SUBJECT”是主要的。 当我使用查询

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

它在访问数据库中完美地工作,但当我试图在我的c#代码中使用它时,我总是会遇到exception。

此外,如果我使用“DELETE FROM Course_Information WHERE Semester = 1;

我想在WHERE条件下同时使用“SUBJECT”和“SEMESTER”(因为在同一学期可能会有不同的科目)

看我的代码,

 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); } 

在工作示例查询中包含从this.textBox2.Text获取的值周围的引号。

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

想象一下this.textBox2.Text包含文本foo 。 如果不在WHERE子句中添加引号,db引擎就会看到... WHERE Semester = 1 AND Subject = foo但它在名为foo的数据源中找不到任何内容,因此假设它必须是一个参数。 您需要引号来指示数据库引擎它是一个字符串文字值‘foo’

实际上,如果切换到参数查询,则可以避免此类问题,因为您不需要在DELETE语句中使用这些引号。 参数查询还可以保护您免受SQL注入。 如果恶意用户可以在this.textBox2.Text输入‘OR’和’=’a a ,则表中的所有行都将被删除。

如果“插入”查询出现相同的错误,则可以使用此方法来避免exception

 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(); }