簡體   English   中英

更新c#wpf中的sql記錄

[英]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

使用Paramters來防止SQLInjection

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM