2011-09-10 16 views
1

我遵循的一个简单的SQL问题:制作与文本字符串的SQL INSERT语句包含“字符

INSERT INTO Table1 
VALUES (value1, value2, value3…) 

这一直很好,到目前为止的语法。但现在我有一些包含普通英文文本的值,比如“我要回家”。 '字符在C#中废除了SQL命令。我写了下面的:

command.CommandText = "INSERT INTO Bio VALUES ('" + name + "','"I'm going home" + "'); 

评估为

INSERT INTO Bio VALUES ('Peter','I'm going home') 

这显然是行不通的。我如何确保特殊字符不会破坏SQL语句?

回答

8

为了天堂的缘故使用SqlParameter。否则你的程序将容易受到SQL Injection的影响。它也将解决你的问题与特殊字符。

+3

除此之外,参数化查询更有可能从优化中受益 - 预编译,服务器端缓存等。 –

+0

谢谢。这是一个明显的答案。 –

1

使用两个单引号,只要有一种想要逃离

此外,而不是建立查询这个样子,你应该在你选择的语言使用参数化查询单引号。自己逃离角色打开SQL注入的大门。

4

了解有关您的提供者的参数化查询。他们存在ODBC,OLEDB,SQL等

command.CommandText = "INSERT INTO Bio Values (@name, @text)"; 
command.Parameters.Add(/* appropriate param type for your provider */); // add for @name, @text, etc. 
// execute query 
+0

我以前用过它们。但是现在我明白他们的目的。 –

-1

我使用

HttpUtility.HtmlEncode(text) 

它使所有的SQL注入的东西消失了,它似乎更容易使用比参数。 不要忘记使用

HttpUtility.HtmlDecode(text) 

,让您的输入回你收到了

+0

请参阅[给我参数化的SQL,或给我死亡](http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html)。参数并不难 - 看看@Anthony Pegram的例子。如果您发现ADO.NET冗长,请考虑使用[ORM](http://en.wikipedia.org/wiki/Object-relational_mapping)。 – TrueWill

+0

您破坏了数据的纯度。数据必须独立于正在使用它的应用程序。名字'O'Connel'必须是'O'Connel',而不是'Connel'。它还可以被桌面应用程序使用,通过WSDL/REST API查询,聚合和分析等。 – Oybek

1

通常你可以用另外一个筛选逃脱单引号的形式。 例如以下是一条有效的声明

INSERT INTO myTable (Column1) VALUES ('Hello I''m Jack'); 

但是我建议你使用参数。

command.CommandText = "INSERT INTO Bio VALUES (@Name, @OtherValue)"; 
command.Parameters.AddWithValue("Name", name); 
command.Parameters.AddWithValue("OtherValue", "I'm going home"); 

一个有利于使用参数的附加点是,您可以免除格式化和其他内容的负担。我的意思是日期值,唯一标识符等