我有一个带有“SEMESTER,SUBJECT,OFFER,RESULT”的表,其中“SEMESTER”和“SUBJECT”是主键。当我使用查询
"DELETE FROM Course_Information WHERE Semester = 1 AND Subject = 'CSE-414' ;
它在Access数据库中运行良好,但是当我尝试在C#代码中使用它时,我总是会遇到异常。

此外,如果我使用“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子句中添加这些引号,则数据库引擎将看到... WHERE Semester = 1 AND Subject = foo,但是它在名为foo的数据源中找不到任何内容,因此假定它必须是一个参数。您需要使用引号来表示数据库引擎它是字符串文字值'foo'。

实际上,如果切换到参数查询,则可以避免此类问题,因为您无需理会DELETE语句中的那些引号。参数查询还可以保护您免受SQL注入(inject)的侵害。如果恶意用户可以在this.textBox2.Text中输入'OR'a'='a,则表中的所有行都将被删除。

关于尝试从Access数据库删除时C#OleDb异常 "No value given for one or more required parameters",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18112264/

10-11 21:33