我正在开发一个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)
{
}
}
尝试将SQL参数重命名为@user_xp。
cmd.Parameters.AddWithValue("@user_xp", new_xp2);
我没有一个可访问的数据库来测试。此外,您需要在最后添加命令以执行查询。cmd.ExecuteNonQuery()
也就是说,学习将DB查询与存储过程或函数分开是一个很好的实践。
正如其他人所指出的,您只是忘记执行非执行查询来运行您设置的命令。
然而,你可以这样写。你没有提到或注意到经验值栏是什么数据类型——我假设是&;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块在这里是一个好主意。