【问题标题】:sql update query not updating databasesql更新查询不更新数据库
【发布时间】:2012-09-30 17:21:14
【问题描述】:

我正在编写一个更新我创建的数据库的应用程序。该应用程序上有一个数据网格视图,它显示来自数据库的数据。 我的应用发生了一些非常奇怪的事情。

这是更新数据库的代码

string updateCommandString = "UPDATE RoomsTable SET [Date Checked]=@checkedDate WHERE      ID = @id"; 
using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\users\spreston\documents\visual studio 2012\Projects\roomChecksProgram\roomChecksProgram\roomsBase.accdb"))
{
    using (OleDbCommand updateCommand = new OleDbCommand())
    {
        updateCommand.Connection = conn;
        updateCommand.CommandText = updateCommandString;
        updateCommand.CommandType = CommandType.Text;
        updateCommand.Parameters.AddWithValue("@checkedDate", 
            this.dateTimePicker1.Value.ToShortDateString());
        updateCommand.Parameters.AddWithValue("@id", row.roomID);
        try
        {
            conn.Open();
            updateCommand.ExecuteNonQuery();
            conn.Close();
            conn.Dispose();
        }
        catch(OleDbException ex)
        {
            MessageBox.Show(ex.Message.ToString());
        }
    }
}

现在,当我运行该代码,关闭应用程序并再次运行应用程序时,更改的内容正确显示在连接到数据库的 datagridview 中,但是当我查看实际数据库时,没有任何变化全部。我不知道为什么会这样。

我的 sql update 更新了连接到 datagrid 视图的数据库。 Sow HOW 是显示正确数据但不显示数据库本身的数据网格视图。

编辑: 我以前没有使用过 sql 的经验。

编辑: 交易代码:

 string updateCommandString = "UPDATE RoomsTable SET [Date Checked]=@checkedDate WHERE ID = @id"; 
                using (OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\users\spreston\documents\visual studio 2012\Projects\roomChecksProgram\roomChecksProgram\roomsBase.accdb"))
                        {
                            OleDbTransaction transaction = null;
                         using (OleDbCommand updateCommand = new OleDbCommand())
                             {

                                    updateCommand.Connection = conn;
                                    updateCommand.Transaction = transaction;    
                                    updateCommand.CommandText = updateCommandString;
                                    updateCommand.CommandType = CommandType.Text;
                                    updateCommand.Parameters.AddWithValue("@checkedDate", this.dateTimePicker1.Value.ToShortDateString());
                                    updateCommand.Parameters.AddWithValue("@id", row.roomID);
                            try
                            {
                                conn.Open();
                                transaction = conn.BeginTransaction();
                                updateCommand.ExecuteNonQuery();
                                transaction.Commit();

                                conn.Close();
                                conn.Dispose();
                            }
                            catch(OleDbException ex)
                            {
                                MessageBox.Show(ex.Message.ToString());
                            }
                        }
                    }

【问题讨论】:

  • 我不确定dateTimePicker1.Value.ToShortDateString() 是否有必要。将 DateTime 转换为字符串是特定于文化的。
  • 为什么要使用 conn.Dispose?当您以原子方式使用“使用”对象时 Dispose
  • 您是否有可能在其中遇到异常但它不是 OldDbException?如果将捕获扩展到“异常”,您会发现什么吗?
  • 如果数据网格从数据库中获取数据,我想不出数据网格显示新更新的数据而不是数据库的任何方式
  • @Kamil 好的,解决了我试图解决的一个问题,即在我提交新日期后更新数据网格视图。但它仍然没有更新实际的数据库

标签: c# ms-access datagridview ado.net


【解决方案1】:

可能的原因:

  1. 您的应用程序可能会连接到数据库文件的副本。在您的项目目录中搜索数据库副本(.accdb 扩展名?)
  2. 也许 David S 是对的,但您必须在数据库上提交更改 (OleDbTransaction help at MSDN)。将隔离设置更改为 READ UNCOMMITTED 是不雅的解决问题的方法。

【讨论】:

  • 我在我的回答中添加了一条附加说明。是的;一般来说,不要更改为 READ UNCOMMITTED。在您的应用程序中提交事务,或者如果您想在测试期间检查事务/数据而不提交,则暂时更改级别。我曾经在尝试调试问题等时想这样做。但是,这不是我通常会去生产的东西。我同意你的说法,即这是一种“不雅”的方法。
  • 啊,我明白了。我没有调用 commit() 方法。但是我会怎么称呼这个方法呢?
  • @Stonep123 你必须创建交易对象。看这里:msdn.microsoft.com/en-us/library/… 让我们知道这是否可行。
  • 用新的事务代码发布编辑问题...executenonquery 抛出异常
  • 把“updateCommand.Transaction = transaction”;创建对象事务后。我的意思是把它放在“transaction = conn.BeginTransaction();”之后,在那个“try”块中。
【解决方案2】:

听起来你可能对我来说有事务隔离问题。如果您不熟悉此主题,建议您 google 并阅读文档。我相信 READ COMMITTED 是默认设置...将其设置为 READ UNCOMMITTED 可能会解决您无法看到更新的问题。但是,这并不是真正推荐的方法。通常,您只需要确保在尝试检查信息之前将所有事务提交到数据库即可。

附加说明:在测试应用程序期间,我不时需要能够从应用程序外部的 SQL 工具查询数据库以检查某些内容。但是,在开发数据库应用程序的近 15 年中,我从来不需要将其设置为 READ UNCOMMITTED 以用于生产。除了 READ COMMITTED 之外,我会非常谨慎地进行生产。我并不是说你永远不需要这样做,但这不是常态(恕我直言)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 2020-05-20
    相关资源
    最近更新 更多