我正在开发一个 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)
{
}
}
答案 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 块在这里是一个好主意。