OleDbCommand 不会更新 MS Access 数据库,不会引发错误

Posted

技术标签:

【中文标题】OleDbCommand 不会更新 MS Access 数据库,不会引发错误【英文标题】:OleDbCommand won't UPDATE MS Access database, no errors thrown 【发布时间】:2012-11-03 08:15:02 【问题描述】:

我已经被这个问题困扰了几个小时,非常感谢任何帮助。

我正在尝试做的事情:使用 OleDb 更新 2003 MS Access 数据库。 当我执行代码时会发生什么:没有错误消息,但数据库根本没有更新。 0 行受影响。 编程语言:C#

额外信息:

(1) var_workid 是一个 int,是我的表的主键。 (2) f2_sub 和 f2_field 是组合框。 (3) f2_date 是一个 DateTimePicker。 (4) f2_details、f2_pacq、f2_daily、f2_area都是TextBox。 (5) 我的连接有效,我可以毫无问题地执行诸如 SELECT ... FROM ... WHERE 之类的语句。 (6).NET2.0

在 MS Access 中。 work_id、account_code、field_id、pacquiao、daily、area都是数字。 细节是文本。 date_done 是日期时间

private void btn_update_Click(object sender, EventArgs e)
    
        string update_query;
        OleDbCommand SQLCommand = new OleDbCommand();

        update_query = "UPDATE [work_done] SET [account_code]= @AccountCode, [field_id] = @FieldID, [details] = @Details, [pacquiao] = @Pacquiao,[daily] = @Daily, [date_done] = @DateDone, [area] = @Area WHERE [work_id] = @WorkID;";
        SQLCommand.CommandText = update_query;
        SQLCommand.Connection = database;

        //Parameters
        SQLCommand.Parameters.AddWithValue("@AccountCode", f2_sub.SelectedValue.ToString());
        SQLCommand.Parameters.AddWithValue("@FieldID", f2_field.SelectedValue.ToString());
        SQLCommand.Parameters.AddWithValue("@Details", f2_details.Text);
        SQLCommand.Parameters.AddWithValue("@Pacquiao", f2_pacq.Text);
        SQLCommand.Parameters.AddWithValue("@Daily", f2_daily.Text);
        SQLCommand.Parameters.AddWithValue("@DateDone", f2_date.Value.ToString());
        SQLCommand.Parameters.AddWithValue("@Area", f2_area.Text);
        SQLCommand.Parameters.AddWithValue("@WorkID", var_workid);

        SQLCommand.CommandText = update_query;
        SQLCommand.Connection = database;

        //string message = "";
        //for (int i = 0; i < SQLCommand.Parameters.Count; i++) 
        //
        //    message += SQLCommand.Parameters[i].Value.ToString() + "\n";
        //
        //MessageBox.Show(message);


        int response = SQLCommand.ExecuteNonQuery();

        MessageBox.Show(response + " Update successful!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.ParentForm.refresh();
        Close();
    

【问题讨论】:

如果您的WHERE 子句不正确,您可以轻松地不更新任何行。这似乎与我之前回答的一个问题非常相似:看看***.com/a/12226939/242520 是否对您有帮助。 添加的参数顺序必须与字段顺序完全一致。首先尝试添加"@WorkID", var_workid);。我在***.com/questions/7165661/… 之前就被这个咬过,但那时我不得不指定你发布的顺序。但我也记得只有在首先指定条件时 sql 才能工作。所以试试吧。自从我因为这些怪癖而放弃了 MSAccess 您的代码对我来说几乎完全一样。我用值替换了更新变量。按照建议检查您的输入,尤其是工作 ID。 @nawfal 不必先指定 where 条件。怎么可能? @Remou,我确实有这样的怪癖。是的,我只有在最后指定 WHERE 条件时才让 MS Access UPDATE 查询工作。但以前我只有在第一次指定时才让它工作。可能用于 SELECT 查询?我现在没有 JET 来测试它。 【参考方案1】:

我认为 OleDbCommand 不支持这样的参数 (OleDbCommand.Parameters Property):

当 CommandType 设置为 Text 时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。

【讨论】:

我尝试将其全部替换为 ?但它仍然不起作用,也不会引发任何错误。 这是正确的,但是使用 JET/ACE 专有的 PARAMETERS 语法,您可以使其工作。但是为什么要打扰呢?只需使用真正的 RDBMS。 只要参数顺序正确,代码就可以工作。名称是方便的提示。上面的代码在模型中工作。 在 ta.speot.is 的基础上 - OleDb 可以使用命名参数:参见 ***.com/questions/4857940/… @BenMcIntyre - 是的,但这不是一般的“OleDb”,它只是 Access/JET OleDb。

以上是关于OleDbCommand 不会更新 MS Access 数据库,不会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

OleDbCommand 不能执行这个命令,为啥?

带有更新查询的 OleDbCommand 导致 OleDbException

查询不会更新子窗体 MS-Access 中的表

MS Access,更新查询不会更新链接表

MS Access 2010:未绑定的组合框不会更新

MS Access 数据表不会根据组合框更新