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。这是一个方便的快捷方式,但它有一个阴暗面,可能会导致错误的查询。
看看
我在更新 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。这是一个方便的快捷方式,但它有一个阴暗面,可能会导致错误的查询。
看看