C# - 新值未反映在使用 UPDATE SQL cmd 的 Access 数据库上

C# - New Values not reflecting on Access Database using UPDATE SQL cmd

我在更新 Access 数据库的用户 table 中的行时遇到问题。这是下面的代码:

    private void SaveProfileInfo()
    {
        try
        {
            ChangeForeColorOfStatusMsg(Color.Black);
            ChangeTextOfStatusMsg("Saving new profile information...");
            const string cmd = @"UPDATE Users SET LastName=@LastName,FirstName=@FirstName,MiddleName=@MiddleName,Add_Num=@Add_Num,Add_Street=@Add_Street,Add_Brgy=@Add_Brgy,Add_City=@Add_City,MobileNumber=@MobileNumber,Gender=@Gender WHERE ID=@ID;";
            var dbConn = new OleDbConnection(cs);
            var dbCmd = new OleDbCommand(cmd, dbConn);

            dbCmd.Parameters.AddWithValue("@ID", UserLoggedIn.ID);
            dbCmd.Parameters.AddWithValue("@LastName", txtLastName.Text);
            dbCmd.Parameters.AddWithValue("@FirstName", txtFirstName.Text);
            dbCmd.Parameters.AddWithValue("@MiddleName", txtMiddleName.Text);
            dbCmd.Parameters.AddWithValue("@Add_Num", txtUnitNum.Text);
            dbCmd.Parameters.AddWithValue("@Add_Street", txtStreet.Text);
            dbCmd.Parameters.AddWithValue("@Add_Brgy", GetBrgySelectedItem());
            dbCmd.Parameters.AddWithValue("@Add_City", GetCitySelectedItem());
            dbCmd.Parameters.AddWithValue("@MobileNumber", txtMobileNumber.Text);
            dbCmd.Parameters.AddWithValue("@Gender", GetGenderSelectedItem());

            dbConn.Open();
            dbCmd.ExecuteNonQuery();
            dbConn.Close();
            ChangeForeColorOfStatusMsg(Color.MediumSeaGreen);
            ChangeTextOfStatusMsg("All changes have been saved! This window will close itself after two seconds.");
            Thread.Sleep(2000);
            CloseForm();
        }
        catch (Exception)
        {
            ChangeForeColorOfStatusMsg(Color.Crimson);
            ChangeTextOfStatusMsg("Something went wrong while we were connecting to our database. Please try again later.");
            hasFinishedEditting = false;
        }
    }

当用户更新其个人资料信息时,此方法将在单独的线程上完成。

UserLoggedIn实际上是Userclass的一个字段(一个class在我的table中定义了一行),它存储了当前登录用户的所有信息.

当我运行这个时,它不会产生任何异常或错误。但是当我检查我的 table 时,这些值没有更新。

我从我用这个系统制作的注册表(有效)中复制粘贴了这些代码,并将其修改为 UPDATE cmd 而不是 INSERT cmd。

我还制作了使用相同 cmd 的更改用户名和密码表单,如下所示:

    public void ChangePass()
    {
        try
        {
            ChangeForeColorOfMsg(Color.Silver);
            ChangeTextOfMsg("Changing password...");

            const string cmd = "update Users set Pass=@Pass where ID=@ID";
            var dbConn = new OleDbConnection(cs);
            var dbCmd = new OleDbCommand(cmd, dbConn);

            dbCmd.Parameters.AddWithValue("@Pass", txtNewPass.Text);
            dbCmd.Parameters.AddWithValue("@ID", UserLoggedIn.ID);

            dbConn.Open();
            dbCmd.ExecuteNonQuery();
            dbConn.Close();
            ChangeTextOfMsg("Password successfully changed!");
        }
        catch (Exception)
        {
            ChangeForeColorOfMsg(Color.Silver);
            ChangeTextOfMsg("A problem occurred. Please try again later.");
        }
    }

这些代码对我有用。所以我现在真的很困惑,为什么这个更新个人资料信息的 cmd 不起作用...有什么我在这里没有看到的吗?

OleDb 无法通过名称识别参数。在将它们发送到您的数据库进行更新时,它遵循严格的位置顺序。在您上面的代码中,第一个参数是 @ID 但此参数在您的查询中最后使用。因此,一切都搞砸了。

你只需要将@ID参数的添加移动到集合的最后

附带说明一下,您应该非常小心地使用 AddWithValue。这是一个方便的快捷方式,但它有一个阴暗面,可能会导致错误的查询。
看看

Can we stop using AddWithValue already?