如何在sql语句中使用字符串变量

本文关键字:字符串 变量 语句 sql | 更新日期: 2023-09-27 18:07:07

我有一个WPF应用程序,在其中我得到

string someone = TextBox.text;

我想在下面的查询

中使用它
query = " Select * From Table Where Title = someone "

我应该如何在查询中使用变量某人?

如何在sql语句中使用字符串变量

你可以这样做

query = "Select * From Table Where Title = " + someone;

但这是不好的,打开你的SQL注入

应该使用参数化查询

像这样的东西应该让你开始

using (var cn = new SqlClient.SqlConnection(yourConnectionString))
using (var cmd = new SqlClient.SqlCommand())
{
   cn.Open();
   cmd.Connection = cn;
   cmd.CommandType = CommandType.Text;
   cmd.CommandText = "Select * From Table Where Title = @Title";
   cmd.Parameters.Add("@Title", someone);
}

来自Jon Skeet的回答,因为他的回答比我的更完整

参见文档中的SqlCommand。

基本上你不应该在SQL中嵌入你的值,原因有很多:

    把代码和数据混在一起是不优雅的
  • 它打开你的SQL注入攻击,除非你非常小心地逃避
  • 你必须担心格式和i18n细节,如数字,日期和times等
  • 查询保持不变,只有值改变,优化器有更少的工作要做-它可以查找之前的优化查询直接,因为它将是一个完美的匹配SQL.

您应该使用参数化的SQL查询:

query = "SELECT * From TableName WHERE Title = @Title";
command.Parameters.Add("@Title", SqlDbType.VarChar).Value = someone;

参见文档中的SqlCommand。

基本上你不应该在SQL中嵌入你的值,原因有很多:

    把代码和数据混在一起是不优雅的
  • 它打开你的SQL注入攻击,除非你非常小心转义
  • 你必须担心格式和i18n细节的东西,如数字,日期和时间等
  • 当查询保持不变,只有值改变时,优化器要做的工作较少-它可以直接查找之前优化的查询,因为它将是SQL方面的完美匹配。

最简单的方法是使用c# Prepared sql。这篇文章的例子。你不必担心转义sql字符串中的字符或其他东西

declare @SqlQuery varchar(2000), @Fromdate varchar(20), @Todate varchar(20)
set @Fromdate='01 jan 2017'
set @Todate='30 mar 2017'

set @SqlQuery='select * from tblEmployee where tblEmployee.JDate between '''+ @Fromdate + ''' and '''+ @Todate+ ''''
print  @SqlQuery