2016-06-28 128 views
0

我想通過我的C#Web應用程序更新Access數據庫,但我目前正在面臨WHERE語句中不更新記錄並且不返回任何錯誤的問題。C#OleDB更新語句不更新

我在嘗試更新文本字段,並且在我的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」,但是數據庫未更新。

+0

你是否在一個正在回滾的事務中? – yaakov

回答

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,以便命令不必猜測它是什麼。我猜想標題是一個varchar和ID是整數,如果這是一個錯誤的假設,請更正此問題。
  • 您可以將「?」使用參數名稱可以使參數的添加更容易閱讀並保持?更新聲明中的佔位符。微軟這是否在他們的許多例子在其文檔中
  • ExecuteNonQuery返回受影響的行數,捕獲結果,並使用它進行調試(見代碼更新)

當我檢查recordsUpdated的值,它返回「1」但數據庫沒有被更新。

如果正在返回1,那麼正在更新1條記錄。這裏有兩個故障排除提示。

  • 你應該確保你的查詢正在更新你正在檢查的記錄。在調試期間捕獲param2的值並在Access中的select語句中手動使用該值,以查看該記錄的標題列SELECT Title FROM Data WHERE ID = [id here]。調試時還獲取TextBox1.Text的值,並根據手動執行的select查詢返回的值檢查此值。
  • 由於這是Ms Access並且文件駐留在磁盤上,請確保您手動檢查連接字符串中要連接的同一數據庫。如果您有2個數據庫副本,則很容易導致錯誤的結論,即更新沒有執行。
+0

如果這不能解決問題,請發佈您的連接字符串。通常,當數據庫不更新時,您正在引用錯誤的數據庫。 – jdweng

+0

我已經用我的完整代碼編輯了主帖子。 連接字符串引用了正確的數據庫,因爲正如我在帖子中所說的,當我擺脫字符串參數時它會更新表。 – mejaw

+0

@mejaw - 我更新了答案 – Igor