我在访问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的个人资料信息不起作用......我有没有看到这里的东西?
答案 0 :(得分:1)
OleDb无法通过名称识别参数。在将数据发送到数据库进行更新时,它遵循严格的位置顺序。在上面的代码中,第一个参数是@ID,但此参数在查询中最后使用。因此一切都搞砸了。
您只需将@ID参数的添加移动到集合
中的最后一个作为旁注,你应该对AddWithValue非常小心。这是一个方便的快捷方式,但它有一个黑暗的一面,可能导致错误的查询 看看