c# - 为什么我的数学不适用于我的 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)
{
}
}
解决方案
正如其他人指出的那样,您只是忘记执行非查询来运行您设置的命令。
但是,您可以这样写。您没有提及或注意经验点列的数据类型是什么 - 我假设为“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() 转换数字表达式 - 这也可能没问题。
此外,“使用块”也正确地清理了命令对象和连接对象 - 所以使用块在这里是一个好主意。
推荐阅读
- c# - 如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?
- azure-devops - 有没有办法制定基于 devops 特定阶段的部分成功或成功的分支策略?
- google-apps-script - 如何不让 Google 协作平台根据上方/下方文本调整图像大小?
- java - 泛型方法作为使用 java.util.Function 的函数式编程
- swift - 如何忽略不正确的类型并使用快速编码继续 json 反序列化?
- mongodb - MongoDB在提取文档时对子文档和子文档进行排序
- c# - 将 JSON 数据从 POSTMAN 传递到控制器时的空值
- reactjs - 如何将 RSA 加密添加到我的 ReactJS 应用程序?
- vuetify.js - 在移动设备上显示 vuetify stepper 标签
- go - go 1.16:如何在 go:embed 中使用带前缀