1

我有以下代码来设置页面加载时的文本框值。

protected void Page_Load(object sender, EventArgs e)
        {
            localhost.UserRegistration m = new localhost.UserRegistration();
            int user = m.ID(Session["Username"].ToString());
            DataSet ds = m.GetUserInfo(user);
            if (ds.Tables.Count > 0)
            {
                TextBox1.Text = ds.Tables[0].Rows[0]["emailAddress"].ToString();
                TextBox2.Text = ds.Tables[0].Rows[0]["password"].ToString();
            }


        }

因此,当第一个用户打开页面时,用户将在文本框中看到他们的电子邮件地址和密码。当他们进行更改并单击更新时,页面加载时的相同值将被发送到数据库,而不是被更改的新值。

我有以下 Web 服务方法来更新用户详细信息

[WebMethod(Description = "Updates a single user")]
        public string UpdateUser(int user, string emailAddress, string password)
        {
            // Create connection object
            int ix = 0;
            string rTurn = "";
            OleDbConnection oleConn = new OleDbConnection(connString);
            try
            {
                oleConn.Open();
                string sql = "UPDATE [User] SET [emailAddress]=@emailAddress, [password]=@password" + " WHERE [ID]=@user";
                OleDbCommand oleComm = new OleDbCommand(sql, oleConn);

                oleComm.Parameters.Add("@user", OleDbType.Integer).Value = user;
                oleComm.Parameters.Add("@emailAddress", OleDbType.Char).Value = emailAddress;
                oleComm.Parameters.Add("@password", OleDbType.Char).Value = password;


                ix = oleComm.ExecuteNonQuery();
                if (ix > 0)
                    rTurn = "User Updated";
                else
                    rTurn = "Update Failed";
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                rTurn = ex.ToString();
            }
            finally
            {
                oleConn.Close();
            }
            return rTurn;
        }

这是表在数据库中的外观

在此处输入图像描述

客户端代码

protected void Button1_Click(object sender, EventArgs e)
        {


            string email = TextBox1.Text;
            string pass = TextBox2.Text;
            localhost.UserRegistration m = new localhost.UserRegistration();
            int usr = m.ID(Session["Username"].ToString());
            m.UpdateUser(usr, email, pass);

        }

谁能告诉我为什么....

4

3 回答 3

2

我认为您正在混淆 SqlParameters 和 OleDbParameters。OleDbParameters不支持命名参数!!

请参阅MSDN OleDbCommand.Parameters

当 CommandType 设置为 Text 时,OLE DB .NET 提供程序不支持将参数传递给 SQL 语句或由 OleDbCommand 调用的存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,OleDbParameter对象添加OleDbParameterCollection 的顺序必须直接对应于命令文本中参数的问号占位符位置。

我认为你应该调整你的代码

...
oleConn.Open();
string sql = "UPDATE [User] SET [emailAddress]=?, [password]=? WHERE [ID]=?";
OleDbCommand oleComm = new OleDbCommand(sql, oleConn);

oleComm.Parameters.Add("@emailAddress", OleDbType.Char).Value = emailAddress;
oleComm.Parameters.Add("@password", OleDbType.Char).Value = password;
oleComm.Parameters.Add("@user", OleDbType.Integer).Value = user;
...

编辑

protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  {
      localhost.UserRegistration m = new localhost.UserRegistration();
      int user = m.ID(Session["Username"].ToString());
      DataSet ds = m.GetUserInfo(user);
      if (ds.Tables.Count > 0)
      {
          TextBox1.Text = ds.Tables[0].Rows[0]["emailAddress"].ToString();
          TextBox2.Text = ds.Tables[0].Rows[0]["password"].ToString();
      }
  }
}
于 2012-10-20T19:56:59.733 回答
0

好的,让它工作。更改了 sql 查询,如下所示。

string sql = "UPDATE [User] SET [emailAddress]=@emailAddress, [password]=@password" + " WHERE [ID]= "+ user;

但它更新了错误的字段。emailAddress 更新为用户 ID,密码更新为电子邮件地址。

于 2012-10-20T19:49:09.810 回答
0

替换以下行:

string sql = "UPDATE [User] SET [emailAddress]=@emailAddress, [password]=@password" + " WHERE [ID]=@user";

To 

string sql = "UPDATE [User] SET [emailAddress]=@emailAddress, [password]=@password where [ID]=@user";

并检查数据库中 Id 的数据类型是否为 int

于 2012-10-20T20:07:18.153 回答