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 プロバイダーは、OleDbCommand によって呼び出される SQL ステートメントまたはストアド プロシージャにパラメーターを渡すための名前付きパラメーターをサポートしません。この場合、疑問符 (?) プレースホルダーを使用する必要があります。例えば:

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

次の行を置き換えます:

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 に答える
0

わかりました。以下のようにSQLクエリを変更しました。

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

しかし、間違ったフィールドを更新します。emailAddress はユーザー ID として更新され、password は電子メール アドレスとして更新されます。

于 2012-10-20T19:49:09.810 に答える