sql ce escape';(单引号)C#

sql ce escape';(单引号)C#,c#,regex,visual-studio-2010,insert,sql-server-ce,C#,Regex,Visual Studio 2010,Insert,Sql Server Ce,我正在写一些代码来存储数据库中的名称。我把名字限制在某些字符上,但是姓氏是一个挑战。因为有些人的名字中有单引号(例如O'Brian),所以我需要允许这样做。因此,我编写了一个正则表达式替换来替换“a”,我认为这应该使“a”成为一个文字。它在替换过程中起作用,但它仍然标记字符串的结尾,我得到了错误 分析查询时出错。[令牌行编号=1,令牌行offeset=71,令牌出错=BRAIN] 我理解这个错误,单引号标记要输入的字符串的结尾,将字符串的其余部分保留在引号之外 我正在使用的代码: Regex r

我正在写一些代码来存储数据库中的名称。我把名字限制在某些字符上,但是姓氏是一个挑战。因为有些人的名字中有单引号(例如O'Brian),所以我需要允许这样做。因此,我编写了一个正则表达式替换来替换“a”,我认为这应该使“a”成为一个文字。它在替换过程中起作用,但它仍然标记字符串的结尾,我得到了错误

分析查询时出错。[令牌行编号=1,令牌行offeset=71,令牌出错=BRAIN]

我理解这个错误,单引号标记要输入的字符串的结尾,将字符串的其余部分保留在引号之外

我正在使用的代码:

Regex reg = new Regex("\'");
firstName = reg.Replace(firstName, "\\'");
lastName = reg.Replace(lastName, "\\'"):
然后使用string.format生成select查询

sqlInsertObj.CommandText = string.Format("INSERT INTO childNameId (childFName, childLName) VALUES ('{0}', '{1}')", fName, lName);
 sqlInsertObj.ExecuteNonQuery();

这适用于任何条目,除非名称中有引号。

最好使用参数化sql查询,而不是使用字符串连接来构建它们。有关文档和示例,请访问

如果您坚持字符串连接,请使用双单引号而不是\来转义它

firstName = firstName.Replace("'", "''" );

好的,谢谢。我试图将过去使用MySQL的方式转换为sql ce。但奇怪的是,双引号仍然抛出了一个异常。谢谢,我将研究参数化sql查询。有任何理由认为它更好吗?参数化查询是唯一应该这样做的方法。它们避免了更多的问题,而不仅仅是单引号。如果不使用它们,这也是一个安全问题,因为它会让您更容易受到SQL注入的攻击attacks@Sander:谢谢你解释我说的“更好”是什么意思。我写得有点快。@Dusty:你也有同样的例外吗?mysql还支持参数化查询。参数化查询可以防止sql注入,那么这是否意味着在将数据插入数据库之前,我不需要编写只允许某些字符的正则表达式?不,例外是因为没有列,这就像我试图插入3个单独的值,但只定义了两列让它们进入。因此,出于某种原因,双引号不是转义字符,而是标记值的结尾。