Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c wpf中更新sql记录_C#_Sql_Wpf - Fatal编程技术网

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();
            }
    }