Sql更新数据

时间:2012-10-20 19:27:53

标签: c# sql web-services

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

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;
        }

这是表格在数据库中的显示方式

enter image description here

客户端代码

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);

        }

有人可以告诉我为什么......

3 个答案:

答案 0 :(得分:2)

我认为你混淆了SqlParameters和OleDbParameters。 OleDbParameters 不支持命名参数 !!

参见 MSDN OleDbCommand.Parameters

  

OLE DB .NET提供程序不支持传递的命名参数   SQL语句或由a调用的存储过程的参数   CommandType设置为Text时的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();
      }
  }
}

答案 1 :(得分:0)

好的让它运转起来。改变了如下的SQL查询。

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

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

答案 2 :(得分: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