如何在sql语句中使用字符串变量
本文关键字:字符串 变量 语句 sql | 更新日期: 2023-09-27 18:07:07
我有一个WPF应用程序,在其中我得到
string someone = TextBox.text;
我想在下面的查询
中使用它query = " Select * From Table Where Title = someone "
我应该如何在查询中使用变量某人?
你可以这样做
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