尝试从Access数据库中删除时,C#OleDb异常"没有给出一个或多个必需参数的值"

use*_*788 5 c# ms-access oledbconnection oledbexception

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

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

它在访问数据库中完美地工作,但是当我尝试在我的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);
            }
Run Code Online (Sandbox Code Playgroud)

Han*_*sUp 7

this.textBox2.Text在工作样本查询中包含您获得的值周围的引号.

" AND Subject = '" + this.textBox2.Text + "';";
Run Code Online (Sandbox Code Playgroud)

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

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

  • 考虑切换到所建议的参数.使用此代码,您可以向应用程序的每个用户打开数据库 (4认同)