我有一个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();
}
}
...没有保存任何内容,因为表格中没有任何内容与新的“已编辑”数据相匹配。
如何编写此文件以检查并发性并更新记录?
答案 0 :(得分:2)
您可以使用update
本身的PrimaryKey
来where clause
表数据,而不要尝试update
数据库中的PrimaryKey
..请使用{ {1}}阻止来自Parameters
。
Use of Paramters to prevent SQLInjection
使用阻止
SQLInjections
语句允许程序员指定何时使用资源的using
应该释放它们。提供给using语句的objects
必须实现object
接口。此接口提供Dispose方法,该方法应释放对象的资源。
IDisposable
希望这能帮到你!
答案 1 :(得分:1)
您可能实际上不会更新关键字段,同时将其保留在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 + "'"