使用不更新的参数更新sql表

时间:2014-12-24 08:24:16

标签: c# asp.net sql-server

我在asp页面中有这个方法,执行时没有错误,甚至没有更新。 我在这个没有更新表的方法中做错了什么?

protected void saveSettings()
{
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sendyourmessageConnectionString"].ConnectionString);
    SqlCommand cmd = new SqlCommand();
    string userName = "something";

        try
        {
            cmd = new SqlCommand("UPDATE Tb_Registration SET Country = @Country, City = @City Where Username = @Username" , con);

            cmd.Parameters.AddWithValue("@Username", SqlDbType.VarChar);
            cmd.Parameters["@Username"].Value=userName;

            cmd.Parameters.AddWithValue("@Country", SqlDbType.VarChar);
            cmd.Parameters["@Country"].Value= txtCountry.Text.Trim();

            cmd.Parameters.AddWithValue("@City", SqlDbType.VarChar);
            cmd.Parameters["@City"].Value= txtCity.Text.Trim();

            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Error occured : " + ex.Message.ToString() + "');", true);
            return;
        }
        finally
        {
            con.Close();
            cmd.Dispose();
            ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Your settings have been saved');", true);
        }
}

4 个答案:

答案 0 :(得分:2)

我认为问题是AddWithValue方法。

它将参数值作为第二个参数,而不是SqlDbType

但是不再使用这种方法了。 可能会产生意外结果。使用.Add() method及其超载。

阅读:Can we stop using AddWithValue() already?

还可以使用using statement来处置您的SqlConnectionSqlCommand

using(SqlConnection con = new SqlConnection(connString))
using(SqlCommand cmd = con.CreateCommand())
{
   cmd.CommandText = @"UPDATE Tb_Registration SET Country = @Country, City = @City
                       Where Username = @Username";
   cmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = userName;
   cmd.Parameters.Add("@Country", SqlDbType.VarChar).Value = txtCountry.Text.Trim();
   cmd.Parameters.Add("@City", SqlDbType.VarChar).Value = txtCity.Text.Trim();
   con.Open();
   cmd.ExecuteNonQuery();
}

答案 1 :(得分:1)

您的问题在这里:cmd.Parameters.AddWithValue("@Country", SqlDbType.VarChar);

如果你使用AddWithValue

,它应该是参数的值,而不是类型

但更好的做法 - 根本不使用AddWithValue,因为它可能会导致不同的问题。

而是使用类似的东西:

cmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = userName;

答案 2 :(得分:1)

插入直接值而不是提供数据类型

 protected void saveSettings()
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sendyourmessageConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand();
        string userName = "something";

            try
            {
                cmd = new SqlCommand("UPDATE Tb_Registration SET Country = @Country, City = @City Where Username = @Username" , con);

                cmd.Parameters.AddWithValue("@Username", userName);


                cmd.Parameters.AddWithValue("@Country",  txtCountry.Text.Trim());


                cmd.Parameters.AddWithValue("@City", txtCity.Text.Trim());


                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Error occured : " + ex.Message.ToString() + "');", true);
                return;
            }
            finally
            {
                con.Close();
                cmd.Dispose();
                ScriptManager.RegisterStartupScript(this, this.GetType(), "Message", "alert('Your settings have been saved');", true);
            }
    }

答案 3 :(得分:0)

AddWithValue的第二个参数是你的值而不是sql类型

 cmd.Parameters.AddWithValue("@Username", userName);