2012-09-30 81 views
2

我正在编写一个应用程序,用于更新一个新创建的数据库。该应用程序上有一个datagridview,用于显示数据库中的数据。 我的应用程序正在进行一些非常奇怪的事情。SQL更新查询没有更新数据库

这是当我运行的代码,收出关的应用程序,并再次运行应用程序,更新数据库

string updateCommandString = "UPDATE RoomsTable SET [Date Checked][email protected] 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更新更新连接到datagrid视图的数据库。 SOW HOW是datagrid视图显示正确的数据,但不显示数据库本身。

编辑: 我以前也没有那种用SQL的经验。

编辑: 交易代码:

string updateCommandString = "UPDATE RoomsTable SET [Date Checked][email protected] 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()); 
          } 
         } 
        } 
+0

我不知道,如果'dateTimePicker1.Value.ToShortDateString()'是必要的。将DateTime转换为字符串是文化特定的。 – nrodic

+3

为什么使用conn.Dispose?当您自动使用“使用”对象时Dispose –

+0

您是否有可能碰到内部异常但它不是OldDbException?如果将捕获扩展到“例外”,你会发现什么? – dougajmcdonald

回答

1

可能的原因:

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

我给我的答案增加了一个附注。是;一般来说,不要改为READ UNCOMMITTED。要么在应用程序中提交事务,要么在测试期间检查事务/数据而不提交,然后暂时更改级别。在尝试调试问题等时,我曾有过想要这样做的场合。但是,这并不是我通常会用来制作的东西。我同意你的观点,认为这是一种“不雅”的做法。 –

+0

啊,我明白了。我没有调用一个commit()方法。但是我会怎么称呼这个方法呢? – Stonep123

+0

我看到了,我更新了我的答案。 – Kamil

0

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

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