2014-07-20 66 views
1

我想在C#來更新我的Access數據庫,我真的不爲什麼不working.My代碼:更新數據庫訪問,C#

public void EditAlbum (Album newAlbum) 
    { 
     command.CommandText = "UPDATE Album SET [Name][email protected], [Description][email protected], [Location][email protected], [Date][email protected],[CoverPhotoURL][email protected] WHERE [ID][email protected]"; 

     command.Parameters.AddWithValue("@Name", newAlbum.Name); 
     command.Parameters.AddWithValue("@Description", newAlbum.Description); 
     command.Parameters.AddWithValue("@Location", newAlbum.Location); 
     command.Parameters.AddWithValue("@Data", newAlbum.Date); 
     command.Parameters.AddWithValue("@Id", newAlbum.ID); 
     command.Parameters.AddWithValue("@Cover", newAlbum.CoverPhoto); 
     command.ExecuteNonQuery(); 
    } 

我的數據庫有一個字段,順序如下:ID,名稱,描述,地點,日期,CoverPhotoURL。 我沒有收到任何錯誤消息,但是這段代碼什麼都不做。

+1

的確切順序的參數你設置一個斷點並驗證到達的代碼? – mason

+1

你怎麼知道它什麼都不做?你沒有在數據庫中得到預期的結果?查詢是否實際在數據庫上執行(您可以使用Profiler查看它)嗎? – dotnetom

+0

您是否曾嘗試在該代碼塊周圍放置try/catch塊以使100%確定該數據庫不返回錯誤? –

回答

3

問題是您將參數添加到集合的順序。
OleDb不能通過它們的名字來識別參數,而只能通過它們的位置來識別。
所以你需要添加在其各自的佔位符出現在查詢

public void EditAlbum (Album newAlbum) 
{ 
    command.CommandText = @"UPDATE Album SET [Name][email protected], 
          [Description][email protected], 
          [Location][email protected], 
          [Date][email protected], 
          [CoverPhotoURL][email protected] 
          WHERE [ID][email protected]"; 

    command.Parameters.AddWithValue("@Name", newAlbum.Name); 
    command.Parameters.AddWithValue("@Description", newAlbum.Description); 
    command.Parameters.AddWithValue("@Location", newAlbum.Location); 
    command.Parameters.AddWithValue("@Data", newAlbum.Date); 
    command.Parameters.AddWithValue("@Cover", newAlbum.CoverPhoto); 
    // Moved after the Cover parameter 
    command.Parameters.AddWithValue("@Id", newAlbum.ID); 
    command.ExecuteNonQuery(); 
} 
+1

哇,我不知道它需要按順序。我以爲參數使用了一種'String.Replace'形式,謝謝你,你可能已經把我從未來的bug中拯救了出來。 :) –

+1

這是OleDb的一個特點,如果您使用SqlClient或MySql提供程序,您可以毫無問題地按順序添加參數。但參數值永遠不會使用字符串連接的形式來替換。這將打敗他們最大的好處(無Sql注入和沒有解析問題)他們被傳遞到數據庫引擎進行正確處理 – Steve

+1

另外,OleDb使用? (問號)的參數佔位符。但是Access也接受@name形式,可能與它的大表弟Sql Server兼容 – Steve