6

我有一张带有“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);
            }
4

3 回答 3

10

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

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

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

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

于 2013-08-07T19:58:34.923 回答
0

如果您在“插入”查询中遇到相同的错误,您可以使用此方法来避免异常

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();
    }
于 2016-12-14T11:06:15.673 回答
-1

您是否更改了任何字段名称?当我使用 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));
于 2022-01-30T23:07:31.747 回答