为了账号安全,请及时绑定邮箱和手机立即绑定

在C#SQL查询中,与直接将值嵌入查询中相比,Parameters.Add()有什么优势?

在C#SQL查询中,与直接将值嵌入查询中相比,Parameters.Add()有什么优势?

C#
慕神8447489 2021-05-05 21:26:59
最近,我看到很多人使用SQLCommand的Parameters属性为查询提供简单的值-像这样:var one = "one";var two = "two";DataTable results = new DataTable();string cmdTxt = String.Format("select NAME from TABLE where NAME like @ONE or NAME like @TWO");using (SqlCommand cmd = new SqlCommand(cmdTxt, Butch.connection)){    cmd.Parameters.Add("@ONE", SqlDbType.Char, 15).Value = "%" + one + "%";    cmd.Parameters.Add("@TWO", SqlDbType.Char, 65).Value = "%" + two + "%";    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))           adapter.Fill(results); }从历史上看,我只是将值嵌入在查询字符串中,如下所示:var one = "one";var two = "two";DataTable results = new DataTable();string cmdTxt = String.Format($"select NAME from TABLE where NAME like '%{one}%' or NAME like '%{two}%");using (SqlCommand cmd = new SqlCommand(cmdTxt, Butch.connection)){    using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))           adapter.Fill(results);}我知道在某些情况下cmd.Parameters.Add()特别有用(例如插入二进制数据),因此我不问这些。我特别在问:对于一个简单的值,使用该值cmd.Parameters.Add()(如第一个代码示例中)而不是将该值嵌入查询字符串中(如第二个示例中)有什么好处?编辑添加:一些评论引用了我声明变量one并two进行了硬编码的事实。我这样做是为了使示例完整(自然),变量将来自其他地方。
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

使用参数要好得多!

为了处理查询,SQL经历了几个步骤。首先,它解析查询文本以检查其语法并创建AST表示形式。然后,它将AST提供给查询计划者以生成将用于执行查询的计划。然后执行计划并返回结果。

如果再次为其提供相同的查询文本,它将识别出该查询文本并跳过解析和计划步骤,只需重新执行计划即可。对于许多查询,解析和计划所花的时间比计划执行所花的时间长得多,因此可以极大地提高性能。对查询进行参数化后,计划本身会接受参数,因此可以重复使用它。当值从字面上出现在查询文本中时,每次值更改时都需要重新分析和重新计划文本。

防止注射是另一个优点。如果您将查询文本构造为

command.CommandText = $"SELECT * FROM [Students] WHERE [Name] = '{name}'";

然后有人谁进入他们的名字为“罗伯特“; DROP TABLE [学生]”可以摧毁你的数据库。但是,如果您使用参数化的固定查询文本并添加与参数相同的名称,

command.CommandText = "SELECT * FROM [Students] WHERE [Name] = @name";
...
command.Paramers.Add("@name",name);

然后,数据库将完成其工作,即在数据库中查找该名称而不破坏它。


查看完整回答
反对 回复 2021-05-21
  • 2 回答
  • 0 关注
  • 263 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信