2011-08-31 40 views
8

我有一个WPF应用程序中,我得到如何使用字符串变量在SQL语句中

string someone = TextBox.text; 

我想在下面的查询

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

我应该如何去使用这个在查询中使用变量的人?

+2

你不应该!有没有听说过SQL注入或参数化查询? –

+0

是的,这是非常糟糕的做法 –

+0

在这里你可以阅读一些SQL注入的例子http://en.wikipedia.org/wiki/SQL_injection –

回答

13

你可以做这个

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注入攻击 小心逃避
  • 你不用担心格式和国际化细节的东西像数字,日期和时间 等
  • 当查询仍然只值相同更改后,优化器的工作量会减少 - 它可以直接查找以前优化的查询 ,因为它将完全匹配SQL的 条款。
+0

如果我有多个变量,我必须添加? – Si8

+1

使用多个参数。看起来像 'cmd.CommandText =“Select * From Table Where Tile = @Title,Thing = @ Thing' 'cmd.Parameters.Add(”@ Title“,someone); cmd.Parameters.Add (“@Thing,东西);' – msarchet

+0

现在有道理。谢谢。 Upvoted。 – Si8

10

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

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

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

SqlCommand.Parameters的文档获取更多信息。

基本上你不应该在SQL中嵌入你的价值观因各种原因:

  • 这是不雅混合代码和数据
  • 它可能让你到SQL注入攻击,除非你是非常小心漏出
  • 你不用担心格式和国际化细节的东西像数字,日期和时间等
  • 当查询保持不变,只有值改变,优化公顷可以直接查找以前的优化查询,因为它将在SQL方面完美匹配。
+1

因为我的接受程度很高,所以至少有人看到接受的答案会看到最充分的信息。 – msarchet

+1

@msarchet:够公平的。 –

1

最简单的就是使用C#Prepared sql。 Example on this post。你不必担心转义字符在您的SQL字符串或任何

-1
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 
相关问题