更新c#wpf中的sql记录

时间:2014-05-08 02:08:54

标签: c# sql 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();
        }

    }

...没有保存任何内容,因为表格中没有任何内容与新的“已编辑”数据相匹配。

如何编写此文件以检查并发性并更新记录?

2 个答案:

答案 0 :(得分:2)

您可以使用update本身的PrimaryKeywhere 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 + "'"