2011-10-12 203 views
7

我有一个字符串如何用双撇号替换撇号?

good overview of ESP's in more detail than you probably need

在插入到SQL表时,它给出了错误。所以我想用双撇撇号替换字符串中像

good overview of ESP''s in more detail than you probably need

如何处理这在C#?

+1

您应该使用数据库转义函数。如果你不这样做,你可能会让自己容易受到SQL注入的攻击。 http://stackoverflow.com/questions/249567/algorithm-to-avoid-sql-injection-on-mssql-server-from-c-code – CheeseSucker

+0

或者,甚至更好:参数化查询。 – MatBailie

回答

10

非常简单:

string s = "good overview of ESP's in more detail than you probably need."; 
string escaped = s.Replace("'","''"); 

注:它通常是使用更安全的命令参数。特别是如果输入字符串的值不受您的代码(即用户条目)控制。

+3

虽然这在技术上是正确的,但它却在错误的方向上引导原始提问者。更好地使用正确的参数并避免SQL注入漏洞。 –

+0

如果字符串被转义,注入仍然会发生吗?据我所知,注入是通过使用一个单一的背教者过早终止sql。 –

8

使用参数对象。

myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); 
    myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need."; 
0

String.Replace(String,String)应该可以正常工作。在这个例子中,你想要:

String.Replace("'", "''") 

但是,我不认为这将解决您的问题。我想你更恰当地寻找:

String.Replace("'", "\'") 

这样做的原因在于MySQL和我想像SQL的其他版本,预计在单引号括起来的字符串。

+0

我同意这直接回答这个问题,但它帮助OP做了一个坏习惯。如果使用参数化查询,这个问题就会消失,并且他们采取一种防止注入攻击的做法,协助执行计划缓存等等。 – MatBailie

+0

@dambrisco:一些SQL方言使用双撇号('')而不是逃逸你为MySQL提出的序列(\')。 –

+0

@Dems - 我完全同意,但是,考虑到这个问题,我认为采取婴儿步骤可能会更好。向不了解转义序列的人解释参数化可能是一个糟糕的开始。无论如何,使用Daok的解决方案要比我的解决方案好得多。 –

2

我一直在处理这个问题的年龄。在客户端执行,用两个单引号替换单引号。如果使用多个varchar输入参数执行sp,这将起作用。唯一的问题是SQL注入,即人们可以看到你在客户端上做什么,这永远不是好事。如前所述,唯一的方法就是在服务器上使用SQLparameters。

0

myCommand.InsertCommand.Parameters.Add(“@ myString”,SqlDbType.VarChar,200); myCommand.InsertCommand.Parameters [“@ myString”]。值