[英]Update sql record in c# wpf
我有一個User類來獲取和設置有關用戶的數據。
private string userId;
public string UserId
{
get { return userId; }
set {
userId = value;
OnPropertyChanged(new PropertyChangedEventArgs("UserId"));
}
}
private string employeeNumber;
public string EmployeeNumber
{
get { return employeeNumber; }
set {
employeeNumber = value;
OnPropertyChanged(new PropertyChangedEventArgs("EmployeeNumber"));
}
}
...
數據從select all查詢檢索到observablecollection,然后顯示在一個簡單的wpf窗口中,該窗口具有一個組合框,用於按用戶ID列出所有用戶,顯示其余用戶數據的文本框。 這一切都很棒。 然而,編輯/保存讓我超過桶。
編輯文本框並單擊保存按鈕后,將執行以下方法
private void btnSave_Click(object sender, RoutedEventArgs e)
{
User user = (User)grdUserManagement.DataContext;
try
{
UserDB.UpdateUser(user);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
顯然,傳遞給Update語句的用戶是新編輯的用戶。
public static void UpdateUser(User user)
{
SqlConnection connection = BusinessDB.GetConnection();
string updateStatement =
"UPDATE Employees SET userid = '" + user.UserId.ToString() + "', " +
"password = '" + user.Password.ToString() + "', " +
"empno = '" + user.EmployeeNumber.ToString() + "', " +
"firstname = '" + user.FirstName.ToString() + "', " +
"lastname = '" + user.LastName.ToString() + "' " +
"WHERE (userid = '" + user.UserId + "' " +
"OR userid IS NULL AND '" +user.UserId.ToString() + "' IS NULL) " +
"AND (password = '" + user.Password.ToString() + "' " +
"OR password IS NULL AND '" + user.Password.ToString() + "' IS NULL) " +
"AND empno = '" + user.EmployeeNumber.ToString() + "' " +
"AND firstname = '" + user.FirstName.ToString() + "' " +
"AND lastname = '" + user.LastName.ToString() + "'";
SqlCommand updateCommand = new SqlCommand(updateStatement, connection);
try
{
connection.Open();
updateCommand.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw ex;
}
finally
{
connection.Close();
}
}
...沒有保存,因為表格中沒有任何內容與新的“已編輯”數據相匹配。
如何編寫此文件以檢查並發性並更新記錄?
您可以使用where clause
本身的PrimaryKey
update
表數據where clause
並且永遠不要嘗試update
DB中的PrimaryKey
。請使用Parameters
來防止SQLInjections
。
使用Block: using
語句允許程序員指定何時使用資源的objects
應該釋放它們。 提供給using語句的object
必須實現IDisposable
接口。 此接口提供Dispose方法,該方法應釋放對象的資源。
using (SqlConnection conn =
new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd =
new SqlCommand("UPDATE Employees SET firstname=@firstname, lastname=@lastname" +
" WHERE Id=@Id", conn))
{
cmd.Parameters.AddWithValue("@Id",user.UserId );
cmd.Parameters.AddWithValue("@firstname",user.FirstName);
cmd.Parameters.AddWithValue("@lastname",user.LastName);
//add whatever parameters you required to update here
int rows = cmd.ExecuteNonQuery();
conn.Close();
}
}
希望這對你有所幫助!
您可能實際上不會更新關鍵字段,同時將其保留在where子句中。 其次where子句對於簡單更新看起來如此復雜。
所以解決方案是擁有一個專用的主鍵,從視圖中隱藏並在where子句中使用相同的主鍵來更新其余的字段,不要使用where子句中的所有字段。 GUID類型的文件在這里效果最好,提供唯一性。 簡單的運行編號也適用於您。
請參閱下面的示例,我將ID稱為表中的主鍵,例如。
string updateStatement =
"UPDATE Employees SET userid = '" + user.UserId + "', " +
"password = '" + user.Password + "', " +
"empno = '" + user.EmployeeNumber + "', " +
"firstname = '" + user.FirstName + "', " +
"lastname = '" + user.LastName + "' " +
"WHERE ID = '" + user.ID + "'"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.