C# 在c wpf中更新sql记录
我有一个用户类,可以获取和设置有关用户的数据C# 在c wpf中更新sql记录,c#,sql,wpf,C#,Sql,Wpf,我有一个用户类,可以获取和设置有关用户的数据 private string userId; public string UserId { get { return userId; } set { userId = value; OnPropertyChanged(new PropertyChangedEventArgs("UserId"));
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"));
}
}
...
数据从全选查询检索到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子句中的情况下实际更新密钥字段。第二,where子句对于一个简单的更新来说非常复杂 因此,解决方案是在视图中隐藏一个专用主键,并在where子句中使用该主键来更新其余字段,而不要使用where子句中的所有字段。GUID类型的字段在这里工作得最好,提供唯一性。一个简单的跑步号码也适用于你 请参阅下面的示例,我将ID作为表中的主键 例如
您可能无法实际更新密钥字段,同时将其保留在where子句中。第二,where子句对于一个简单的更新来说非常复杂 因此,解决方案是在视图中隐藏一个专用主键,并在where子句中使用该主键来更新其余字段,而不要使用where子句中的所有字段。GUID类型的字段在这里工作得最好,提供唯一性。一个简单的跑步号码也适用于你 请参阅下面的示例,我将ID作为表中的主键 例如 您可以使用where子句中的PrimaryKey本身更新表数据,并且永远不要尝试更新DB中的PrimaryKey。。请使用这些参数来防止SQL注入 使用块: using语句允许程序员指定使用资源的对象何时释放它们。提供给using语句的对象必须实现IDisposable接口。此接口提供Dispose方法,该方法应释放对象的资源 希望这对你有帮助 您可以使用where子句中的PrimaryKey本身来更新表数据,并且永远不要尝试更新DB中的PrimaryKey。。请使用这些参数来防止SQL注入 使用块: using语句允许程序员指定使用资源的对象何时释放它们。提供给using语句的对象必须实现IDisposable接口。此接口提供Dispose方法,该方法应释放对象的资源
希望这对你有帮助 +1,但是可能会提到,查询应该使用参数来避免SQL注入。+1,但是可能会提到,查询应该使用参数来避免SQL注入。感谢Shekhar Shete和Pushpraj Ruhal,这两个答案都非常有用。感谢Shekhar Shete和Pushpraj Ruhal,这两个答案都非常有用。关于上述问题,确保并发性的最佳方法是什么?关于上述问题,确保并发性的最佳方法是什么?
string updateStatement =
"UPDATE Employees SET userid = '" + user.UserId + "', " +
"password = '" + user.Password + "', " +
"empno = '" + user.EmployeeNumber + "', " +
"firstname = '" + user.FirstName + "', " +
"lastname = '" + user.LastName + "' " +
"WHERE ID = '" + user.ID + "'"
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();
}
}