Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“OleDb例外情况”;没有给出一个或多个所需参数的值“;试图从Access数据库中删除时_C#_Ms Access_Oledbconnection_Oledbexception - Fatal编程技术网

C# C“OleDb例外情况”;没有给出一个或多个所需参数的值“;试图从Access数据库中删除时

C# C“OleDb例外情况”;没有给出一个或多个所需参数的值“;试图从Access数据库中删除时,c#,ms-access,oledbconnection,oledbexception,C#,Ms Access,Oledbconnection,Oledbexception,我有一张表格,上面写着“学期、科目、录取通知书、成绩”,其中“学期”和“科目”是主键。当我使用查询时 “从课程信息中删除,其中学期=1,科目='CSE-414'; 它在access数据库中工作得很好,但当我试图在c#代码中使用它时,总是出现异常 此外,如果我使用“从课程信息中删除,其中学期=1 我想在WHERE条件下同时使用“主题”和“学期”(因为同一学期可能有不同的主题) 看看我的代码 connection_string = aConnection.return_connectionStrin

我有一张表格,上面写着“学期、科目、录取通知书、成绩”,其中“学期”和“科目”是主键。当我使用查询时

“从课程信息中删除,其中学期=1,科目='CSE-414';

它在access数据库中工作得很好,但当我试图在c#代码中使用它时,总是出现异常

此外,如果我使用“从课程信息中删除,其中学期=1

我想在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);
            }

在工作示例查询中,包括从
this.textBox2.Text
获得的值周围的引号

" AND Subject = '" + this.textBox2.Text + "';";
想象一下
这个.textBox2.Text
包含文本foo。如果不在
WHERE
子句中添加这些引号,db引擎将看到
。。。其中,学期=1,主题=foo
,但在名为
foo
的数据源中找不到任何内容,因此假设它必须是一个参数。您需要引号来向db引擎发出信号,它是一个字符串文本值“foo”


实际上,如果切换到参数查询,可以避免这种类型的问题,因为您不需要麻烦处理
DELETE
语句中的那些引号。参数查询还可以防止SQL注入。如果恶意用户可以在
此.textBox2.Text
中输入'OR'a'='a,则表中的所有行都将被删除。

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

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

它起作用了!:我不敢相信这只是因为“它不起作用!”!谢谢!尽管如此,还是考虑切换到参数。使用此代码,您可以向应用程序的每个用户打开数据库