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

11

我有一个WPF应用程序,我正在其中获取

string someone = TextBox.text;

我想在以下查询中使用这个

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

我应该如何在查询中使用变量“someone”?


2
你不应该这样做!你听说过SQL注入或参数化查询吗? - Dustin Davis
是的,这是非常不好的做法。 - Dustin Davis
这个问题太宽泛了,相当于如何在WPF应用程序中基于用户输入从SQL Server获取数据。整本书都可以覆盖这个话题。 - Ben Robinson
在这里,您可以阅读一些SQL注入示例:http://en.wikipedia.org/wiki/SQL_injection - Cacho Santa
我现在感觉很愚蠢 :D Ben - Viktor Vice
堆栈溢出会让你这样,与社区中那么友好的人一起。声望越高,回答就越不友善。喜欢那些没有建设性批评或根本没有答案的回复;相反,他们只是告诉你你很愚蠢,你所做的事情是错误的,或者关闭你的问题。 - Hermes Trismegistus
4个回答

27
你可以直接这样做。
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.Parameters文档以获取更多信息。

基本上,由于各种原因,你不应将值嵌入到SQL语句中:

  • 在代码和数据中混合使用是不优雅的
  • 这会使您面临SQL注入攻击,除非您非常小心地进行转义
  • 您需要考虑数字、日期和时间等格式和i18n细节
  • 当查询保持不变但只有值更改时,优化器需要做的工作就少了 - 它可以直接查找以前的优化查询,因为它们在SQL方面是完全匹配的。

如果我有多个变量需要相加怎么办? - Si8
1
使用多个参数,代码看起来像这样:cmd.CommandText = "Select * From Table Where Tile = @Title, Thing = @Thingcmd.Parameters.Add("@Title", someone); cmd.Parameters.Add("@Thing, thing); - msarchet

14

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

query = "SELECT * From TableName WHERE Title = @Title";

command.Parameters.Add("@Title", SqlDbType.VarChar).Value = someone;

请查看SqlCommand.Parameters文档以获取更多信息。

基本上你不应该将值嵌入到SQL语句中,因为:

  • 将代码和数据混合在一起不太优雅
  • 除非你非常小心地进行转义,否则会使你容易受到SQL注入攻击的影响
  • 你需要考虑数字、日期和时间等格式化和i18n细节
  • 当查询保持不变但只有值改变时,优化器的工作量就会减少——它可以直接查找以前优化过的查询,因为从SQL的角度来看,它们是完全匹配的。

2
我将你的回答核心内容合并到我的回答中,因为我的回答被接受了,所以至少查看被接受的答案的人会看到最完整的信息。 - msarchet

1
最简单的方法是使用C# Prepared sql。 此帖子上的示例。您不必担心在SQL字符串中转义字符或任何其他内容。

0
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接