2012-09-30 149 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之外,我會非常謹慎地進行生產。我並不是說永遠不會有你需要這樣的情況,但這不是常態(恕我直言)。