首页 > 解决方案 > 为什么我的数学不适用于我的 SQL Server 数据库?

问题描述

我正在开发一个 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)
        {
        }
    }

标签: c#asp.netsql-serverdatabase

解决方案


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

但是,您可以这样写。您没有提及或注意经验点列的数据类型是什么 - 我假设为“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() 转换数字表达式 - 这也可能没问题。

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


推荐阅读