C# 更新 SQL Server 表

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查询有关。


你遇到了哪些错误?此外,你不需要在参数周围加上 ',它应该只是 User_FirstName=@User_FirstName - Manatherin
1
那么,你想从我们这里得到什么? - user240141
哈哈,就像我说的,我认为 SQL 查询有问题,但现在已经修复了!好吧,还有一件事,它没有更新。 - user2786856
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";

用户ID列的数据类型是什么?也许像@Steve所说的那样,如果它是数字字段,您可能需要转换为int。 - rcs
如果是这样的话,你可以尝试将 string User_ID = Session["ID"].ToString(); 替换为 int User_ID = Convert.ToInt32(Session["ID"].ToString()); 吗? - rcs

4
不要使用单引号包含参数占位符。这样它们就变成了简单的字符串文字,您的查询将无法工作。
 string querystr = "UPDATE Users SET User_FirstName=@User_FirstName, " + 
                   "User_LastName=@User_LastName WHERE User_ID=@User_ID";

还有一件需要考虑的事情。你确定你的User_ID字段在数据库中是一个字符串(text、nvarchar、varchar)类型的字段吗?如果是数字型的话,那么你需要将传递给该字段的值转换为数字类型(例如使用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替换了SqlParameterCollection.Add方法,该方法接受一个字符串和一个对象。由于使用字符串和SqlDbType枚举值作为参数时会产生歧义,因此使用字符串和对象作为参数的Add方法已被弃用。当您想要通过指定名称和值来添加参数时,请使用AddWithValue。

然而,隐式转换的优点也是缺点,因为转换可能不是最优的。我可以提供这篇非常详尽的文章作为参考。
还有一点需要记住,不要吞噬异常。在您的代码中,仅提供通用消息来告知用户发生了错误是不够的,无法让您了解发生了什么错误。您应该将代码替换为:
try
{
   ......
}
catch(Exception ex)
{
      // I let you translate... :-)
      StatusMessage.Text = "Noget er galt, prøv lidt senere "  + 
                           "Error message=" + ex.Message;
}

我的表结构是 User_ID、User_Username、User_Password、User_FirstName 和 User_LastName。 - user2786856
User_ID 的数据类型为 INT。 - user2786856
那么最好使用适当的转换。我将在上面的答案中展示一个例子。 - Steve
很酷,我刚开始编写C#代码,所以知道这点很好,谢谢。但不幸的是,它没有起作用 :( - user2786856
你收到任何错误信息了吗?Session["ID"] 真的包含一个数字吗? - Steve
我刚刚检查了你上面的代码。请删除通用的catch并添加更精确的处理程序,因为这样你不知道到底哪里出了问题。更新答案。 - Steve

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

-1
string queryStr = "UPDATE SET USER (account, user, password, permission_level)" +
"VALUES ('" + tbxAccount.Text + "', '" + tbxUsername.Text +
"', '" + tbxPassword.Text + "', '" + tbxPermission.Text + "');";

 


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接