2

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

这是更新数据库的代码

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 更新了连接到数据网格视图的数据库。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());
                            }
                        }
                    }
4

2 回答 2

1

可能的原因:

  1. 您的应用程序可能会连接到数据库文件的副本。在您的项目目录中搜索数据库副本(.accdb 扩展名?)
  2. 也许 David S 是对的,但您必须在数据库上提交更改(MSDN 上的 OleDbTransaction 帮助)。将隔离设置更改为 READ UNCOMMITTED 是一种不优雅的解决问题的方法。
于 2012-09-30T17:41:09.303 回答
0

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

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

于 2012-09-30T17:28:05.737 回答