3

我试图编写一个update语句来更新我的 SQL Server 表中的一些信息

到目前为止,这是我的代码,我看不到问题。

protected void Page_Load(object sender, EventArgs e)
{
    FirstNameEdit.Text = Session["FirstName"].ToString();
    LastNameEdit.Text = Session["LastName"].ToString();
}

protected void SubmitEdit_Click(object sender, EventArgs e)
{
    if (FirstNameEdit.Text == "")
    {
        StatusMessage.Text = "Indtast venligst dit fornavn. ";
    }
    else
    {
        if (LastNameEdit.Text == "")
        {
            StatusMessage.Text = "Indtast venligst dit efternavn. ";
        }
        else
        {
            try
            {
                SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=Break;Integrated Security=True");
                SqlCommand command = new SqlCommand("SELECT * FROM Users", connection);
                command.Connection.Open();

                string querystr = "UPDATE Users SET User_FirstName='@User_FirstName', User_LastName='@User_LastName' WHERE User_ID='@User_ID'";
                SqlCommand query = new SqlCommand(querystr, connection);

                string User_ID = Session["ID"].ToString();
                string User_FirstName = FirstNameEdit.Text;
                string User_LastName = LastNameEdit.Text;

                query.Parameters.Add("@User_ID", User_ID);
                query.Parameters.Add("@User_FirstName", User_FirstName);
                query.Parameters.Add("@User_LastName", User_LastName);
                query.ExecuteNonQuery();

                string FirstName = FirstNameEdit.Text;
                Session.Add("FirstName", FirstName);
                string LastName = LastNameEdit.Text;
                Session.Add("LastName", LastName);

                StatusMessage.Text = "Din profil er opdateret";

                command.Connection.Close();
            }
            catch
            {
                StatusMessage.Text = "Noget er galt, prøv lidt senere";
            }
        }
    }
}

我也搜索了很多,但它与我发现的完全相同。也许这与 SQL 查询有关。

4

4 回答 4

4

究竟是什么问题?

我认为在使用参数化查询指定参数时,您不再需要使用引号,因此

string querystr = "UPDATE Users SET User_FirstName='@User_FirstName', User_LastName='@User_LastName' WHERE User_ID='@User_ID'";

应该成为

string querystr = "UPDATE Users SET User_FirstName=@User_FirstName, User_LastName=@User_LastName WHERE User_ID=@User_ID";
于 2013-11-01T08:56:01.180 回答
4

不要用单引号将参数占位符括起来。这样,它们就变成了简单的字符串文字,并且您的查询无法正常工作

 string querystr = "UPDATE Users SET User_FirstName=@User_FirstName, " + 
                   "User_LastName=@User_LastName WHERE User_ID=@User_ID";

另一件要考虑的事情。您确定您的 User_ID 字段是数据库中的字符串(文本、nvarchar、varchar)字段吗?如果它是一个数值字段,那么您需要将作为该字段的参数传递的值转换为数值(IE 使用 Convert.ToInt32)

因此,如果这是真的,代码可以更改为

string User_ID = Session["ID"].ToString();
string User_FirstName = FirstNameEdit.Text;
string User_LastName = LastNameEdit.Text;

query.Parameters.AddWithValue("@User_ID", Convert.ToInt32(User_ID));
query.Parameters.AddWithValue("@User_FirstName", User_FirstName);
query.Parameters.AddWithValue("@User_LastName", User_LastName);
query.ExecuteNonQuery();

我按照 MSDN 中的建议使用了 AddWithValue

AddWithValue 替换了接受 String 和 Object 的 SqlParameterCollection.Add 方法。采用字符串和对象的 Add 重载已被弃用,因为可能与 SqlParameterCollection.Add 重载采用 String 和 SqlDbType 枚举值,其中通过字符串传递整数可能被解释为参数值或对应的 SqlDbType 值。每当您想通过指定参数的名称和值来添加参数时,请使用 AddWithValue。

但是,隐式转换的优点也是缺点,因为转换可能不是最佳的。我可以将这篇非常详尽的文章作为参考

要记住的另一个注意事项。不要吞下异常。在您的代码中,告知用户失败的通用消息不足以让您了解发生了什么问题。您应该将代码替换为

try
{
   ......
}
catch(Exception ex)
{
      // I let you translate... :-)
      StatusMessage.Text = "Noget er galt, prøv lidt senere "  + 
                           "Error message=" + ex.Message;
}
于 2013-11-01T08:56:33.203 回答
0

首先,正如其他人所说 - 不要在查询中使用单个配额,你不需要那个。

其次:当您为命令定义参数时,您可以使用两种变体:

1)query.Parameters.AddWithValue("@User_FirstName", User_FirstName);

或者

2)query.Parameters.Add("@User_FirstName", SqlDbType.VarChar).Value = User_FirstName;

你不能使用query.Parameters.Add("@User_FirstName", User_FirstName);

于 2016-01-19T04:37:14.623 回答
-1
string queryStr = "UPDATE SET USER (account, user, password, permission_level)" +
"VALUES ('" + tbxAccount.Text + "', '" + tbxUsername.Text +
"', '" + tbxPassword.Text + "', '" + tbxPermission.Text + "');";

 

于 2016-01-19T04:22:54.710 回答