为什么我的数学在我的 SQL Server 数据库上不起作用?

时间:2021-02-18 18:16:45

标签: c# asp.net sql-server database

我正在开发一个 asp.net web 应用程序,我正在尝试向其中添加一个用户 xp 系统。我有一个连接到它的 SQL Server 数据库,我正在尝试制作一个功能,该功能将为用户提供 5 点经验值。

我查询了登录的用户,访问了 user_xp 列,我尝试将 +5 添加到 xp 的旧会话变量中,然后将其发送回数据库进行存储。这是我的代码,我不确定它有什么问题。

void generateXp()
{
        try
        {
            SqlConnection con = new SqlConnection(strcon);

            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }

            SqlCommand cmd = new SqlCommand("UPDATE member_master_tbl SET user_xp = @user_xp WHERE " +
                "user_name = '" + Session["username"].ToString().Trim() + "'", con);
            int xp = 5;
            int current_xp = Convert.ToInt32(Session["user_xp"]);
            int new_xp = xp + current_xp;
            string new_xp2 = Convert.ToString(new_xp);

            cmd.Parameters.AddWithValue("user_xp", new_xp2);
        }
        catch (Exception ex)
        {
        }
    }

2 个答案:

答案 0 :(得分:0)

尝试将 SQL 参数重命名为 @user_xp。

cmd.Parameters.AddWithValue("@user_xp", new_xp2);

我没有可供测试的可访问数据库。此外,您需要在最后添加执行查询的命令。 cmd.ExecuteNonQuery() 话虽如此,学习将数据库查询与存储过程或函数分开是一种很好的做法。

答案 1 :(得分:0)

正如其他人所指出的,您只是忘记执行非查询来运行您设置的命令。

不过,你可以这样写。您没有提及或注意经验值列的数据类型 - 我假设为“int”。

所以,你的代码块可以这样写:

using (SqlCommand cmd = new SqlCommand("UPDATE member_master_tbl SET user_xp = @user_xp WHERE user_name = @user",
      new SqlConnection(strcon)))
{
    cmd.Parameters.Add("@user_xp", SqlDbType.Int).Value = 5 + Session("user_xp");
    cmd.Parameters.Add("@user", SqlDbType.NVarChar).Value = Session("username");

    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
}

注意命令对象如何有一个连接对象(所以我们不需要单独的一个)。

虽然这里有几个人“哀叹”字符串集中来构建 sql 并警告 sql 注入?

实际上,为这两个值引入@参数可以清理代码。所以你得到了很好的参数 - 很好的类型检查,你不必记得在字符串周围添加/使用/使用引号之类的东西,但不是数字。

我让 .net 从 session() 中投射数字表达式 - 这也可能没问题。

此外,“using 块”也正确地清理了命令对象和连接对象 - 所以 using 块在这里是一个好主意。

相关问题