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

时间:2015-03-14 16:42:23

标签: c# cmd sql-update

我在访问Access数据库的Users表中更新了一行时出现问题。以下是代码:

    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实际上是User类的一个字段(在我的表中定义一行的类),它存储当前登录用户的所有信息。

当我运行它时,它不会产生任何异常或错误。但是当我检查我的表时,值不会更新。

我从我使用此系统制作的注册表(有效)中复制粘贴这些代码,并将其修改为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的个人资料信息不起作用......我有没有看到这里的东西?

1 个答案:

答案 0 :(得分:1)

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

您只需将@ID参数的添加移动到集合

中的最后一个

作为旁注,你应该对AddWithValue非常小心。这是一个方便的快捷方式,但它有一个黑暗的一面,可能导致错误的查询 看看

Can we stop using AddWithValue already?