【问题标题】:C# OleDB Update statement not updatingC# OleDB 更新语句未更新
【发布时间】:2016-06-28 10:20:37
【问题描述】:

我正在尝试通过我的 C# Web 应用程序更新 Access 数据库,但我目前在 WHERE 语句中遇到问题,没有更新记录并且没有返回任何错误。

我正在尝试更新一个文本字段,而我的 WHERE 语句中的条件是一个整数。

        OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;
        cmd.Parameters.AddWithValue("@Title", TextBox1.Text);
        cmd.Parameters.AddWithValue("@ID", param2);

我什至尝试过这样做

        OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;
        cmd.Parameters.AddWithValue("?", TextBox1.Text);
        cmd.Parameters.AddWithValue("?", param2);

但它仍然没有更新!
我发现试图修复它的是,当我用单引号之间的字符串替换第一个参数时(见下文),它实际上会更新表格。

OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = 'test' WHERE ID = @ID");

你们中有人知道为什么会发生这种情况吗?

编辑:这是完整的代码

    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;
        cmd.Parameters.AddWithValue("@Title", TextBox1.Text);
        cmd.Parameters.AddWithValue("@ID", param2);
        conn.Open();
        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);

        }

编辑 2:
这是我尝试设置数据类型后的代码,它仍然无法正常工作。
澄清一下,在我的 Access 数据库中,ID 是“自动编号”,标题是“长文本”

    using (OleDbConnection conn = new OleDbConnection(connectionString))
    {
        OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;
        cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar;
        cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer;
        conn.Open();
        try
        {
            var recordsUpdated = cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }

当我检查 recordsUpdated 的值时,它返回“1”但数据库没有被更新。

【问题讨论】:

  • 您是否处于正在回滚的事务中?

标签: c# sql ms-access oledb


【解决方案1】:

您需要调用执行语句的ExecuteNonquery

// your OleDbConnection should also be wrapped in a using statement to ensure it is closed
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open(); // open the connection
    using(OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?")) // wrap in using block because OleDbCommand implements IDisposable
    {
        cmd.CommandType = CommandType.Text;
        cmd.Connection = conn;
        cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar; // Title, also set the parameter type
        cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer; // ID, I am guessing its an integer but you should replace it with the correct OleDbType
        var recordsUpdated = cmd.ExecuteNonQuery(); // execute the query

        // recordsUpdated contains the number of records that were affected
    }
}
  • 您添加的参数的顺序必须与sql语句中参数的顺序相匹配。
  • 确保为每个参数指定OleDbType,这样命令就不必猜测它是什么。我猜 Title 是一个 varchar 并且 ID 是整数,如果这是一个错误的假设,请纠正这个。
  • 您可以替换“?”使用参数名称使添加的参数更易于阅读并保留?更新语句中的占位符。 Microsoft 在其文档中的许多示例中都是这样做的
  • ExecuteNonQuery 返回受影响的行数,捕获结果并用于调试(见代码更新)

当我检查 recordsUpdated 的值时,它返回“1”但数据库没有被更新。

如果返回 1,则更新 1 条记录。这里有 2 个故障排除技巧。

  • 您应该确保您的查询正在更新您正在检查的同一条记录。在调试期间捕获param2 的值并在Access 中的选择语句中手动使用该值以查看该记录SELECT Title FROM Data WHERE ID = [id here] 的标题列。还要在调试中获取TextBox1.Text 的值,并根据手动执行的select 查询返回的值检查该值。
  • 由于这是 Ms Access 并且文件驻留在磁盘上,因此请确保您在连接字符串中手动检查要连接到的同一数据库。如果您有 2 个数据库副本,这很容易导致错误的结论是没有执行更新。

【讨论】:

  • 如果这不能解决问题,请发布您的连接字符串。通常当数据库没有更新时,您引用了错误的数据库。
  • 我已经用我的完整代码编辑了主帖。连接字符串引用了正确的数据库,因为正如我在帖子中所说,当我摆脱字符串参数时它会更新表。
  • 我的帖子又更新了,请大家看看。谢谢
  • 好的,我想我知道问题出在哪里,但我不明白为什么会这样。此查询链接到 Button_Click 事件,当我尝试检查发送到数据库的值时,我发现它正在发送原始值。我正在尝试从数据库中填充一个文本框,然后能够更新它。我的问题是发送的值不是当前文本框值,而是从数据库填充的原始值。我希望你明白我想说的话。谢谢。
  • @mejaw - 我不知道这是 Web 表单、mvc、Windows 表单、wpf 等,所以我帮不了你太多。在您的代码中的某个地方,您可能正在覆盖该文本框的值,或者您可能引用了错误的文本框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多