我有以下代码在页面加载时设置文本框值。
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);
}
有人可以告诉我为什么......
答案 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