2010-10-02 63 views
2

我已經搜索過,但沒有任何反應,我剛剛開始使用C#.NET,並且我在表單上有一個文本框。我從數據庫中檢索一些數據,然後通過組合框顯示給我想要顯示的部分(我已經這樣做了!),但是當我嘗試更新什麼都不起作用時,我單擊我的按鈕以更新訪問數據庫(Access 2007年),並沒有任何反應,用戶只需改變一些東西,按鈕有更新存取權限的數據庫,我希望你能幫助我:d 這是我到目前爲止的代碼:從Textbox幫助更新Access數據庫的問題?

 String textTobeUpdated = textBox3.Text; 
     String thing = comboBox2.Text; 




     using (var conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDataBase.accdb")) 

     using (var cmd = conn.CreateCommand()) 
     { 


      cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing"; 
      cmd.Parameters.AddWithValue("@content",content); 


      conn.Open(); 



      int rowsAffected = cmd.ExecuteNonQuery(); 
      if (rowsAffected == 1) 
      { 
       MessageBox.Show("Success"); 
      } 
      else 
      { 
       MessageBox.Show(string.Format("{0} Rows Affected", rowsAffected)); 
      } 

這個代碼顯示一個消息告訴「未處理的異常,如果繼續點擊,應用程序將忽略此錯誤並繼續意圖,如果單擊退出,應用程序將立即關閉」對於某些所需的參數沒有指定的值。

回答

0

看起來你執行查詢兩次(在這裏你打電話cmd.ExecuteNonQuery();兩個方面)

刪除第一個離開,說

int rowsAffected = cmd.ExecuteNonQuery(); 

這條線將執行更新行,然後怎麼算許多行被更新。這個計數然後用於向用戶顯示消息。

你也沒有設置content變量的值(我猜它應該是文本框的值),更新查詢本身看起來有點奇怪,你沒有參數化你的'東西'更新,所以我想它應該是:

cmd.CommandText = "UPDATE Section SET content=[@content] WHERE name=[@thing]"; 
cmd.Parameters.AddWithValue("@content", textTobeUpdated); 
cmd.Parameters.AddWithValue("@thing", thing); 
+0

它只是顯示一條消息,通過應用程序 – peggalvan 2010-10-02 16:30:28

+0

@Natalie告訴我未處理的異常。如果您使用例外文本更新原始問題,可能會有所幫助。 – Slartibartfast 2010-10-02 16:44:58

+0

我編輯過,似乎有什麼錯在查詢我認爲 – peggalvan 2010-10-02 16:54:35

0

如果你是新的.NET和使用最新的C#版本,那麼我會建議你使用LINQ編寫數據訪問代碼。

你必須學習LINQ,但這比學習ADO.NET更自然。

然後,您會使用一個Repository類爲您的應用程序編寫數據訪問,並且最終得到一個更易維護的代碼庫。

我認爲Slartibartfast的解決方案是正確的,給定的代碼,但我發佈這個答案不是評論,因爲使用LINQ是更容易的學習曲線。如果需要的話,您可以學習ADO.NET。

編輯:

我認爲C#你需要在閱讀了位是LINQ,LINQ到SQL,LINQ到實體,以及用於封裝數據訪問代碼存儲庫模式。上面的代碼是使用ADO.NET編寫的,這是實現這一目標的艱難低級方法。除非你有遺傳代碼,否則LINQ是我要走的路,我覺得。

a。 LINQ:

LINQ代表語言集成查詢,它允許您查詢對象集合,就像數據庫一樣。但是,它的LINQ to SQL和LINQ to Entities也是一種數據訪問技術。它允許您查詢,創建,編輯和刪除數據庫(或其他數據存儲區)中的數據。它「看起來」像SQL,但是很強類型。

b。版本庫模式:

版本庫模式是一種模式,它允許您對數據訪問代碼進行標準化(並測試它是否如此傾向),所有代碼都封裝在類中。它使你的代碼更加可維護。

互聯網充滿了討論,博客和如何使用LINQ的示例。

編輯提供來樣的LINQ to SQL選項:

的你想要做的是,大概什麼梗概:

假設你已經創建了一個名爲dbDataContext的DBML文件,並記錄你想要更新的表格名爲MyTable:

// instantiate the datacontext object using the connection string 
var db = new dbDataContext("myConnectionString"); 

// retrieve the record to update 
var record = (from r in db.Section where r.Name == "thing" select r).Single(); 

if (record != null) record.Content = "Content"; 

try 
{ 
// try to update the database 
db.SubmitChanges(); 
MessageBox.Show("Success!"); 
} 
catch 
{ 
// Darn! Didn't work... 
MessageBox.Show("Ooops!"); 
} 

注意這是多麼可讀。

+0

感謝您的建議,我認爲我需要更好地理解所有的概念,我知道有點Java – peggalvan 2010-10-02 17:32:48

+0

我認爲這是更具可讀性,我需要學習Linq,並在項目中使用謝謝回答 – peggalvan 2010-10-02 18:27:35

+0

http://stackoverflow.com/questions/295772/query-microsoft-access-mdb-database -using-linq-and-c – awrigley 2010-10-03 07:58:04

0

變化:cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";

要:cmd.CommandText = "UPDATE Section SET content = ? WHERE name= thing";

通過OLEDB我不認爲你可以在命名命令文本到Jet/ACE的參數。如果你有多個參數,你必須保持它們的順序並繼續使用'?'。

...Where [This] = ? AND [That] = ?; 

以正確的順序添加參數。

+0

感謝您的asnwering,但我添加了正確的順序參數,但沒有任何反應,當我檢查訪問數據庫時,沒有變化 – peggalvan 2010-10-03 02:49:15

+0

您是否使用問號而不是commandtext中的參數名稱? – JeffO 2010-10-03 14:14:04