sql ce escape '(单引号) C#
Posted
技术标签:
【中文标题】sql ce escape \'(单引号) C#【英文标题】:sql ce escape '(single quote) C#sql ce escape '(单引号) C# 【发布时间】:2010-09-26 17:03:27 【问题描述】:我正在编写一些代码来将名称存储在数据库中。我将名称限制为仅某些字符,但姓氏是一个挑战。由于有些人的名字中有单引号(例如 O'Brian),我需要允许这样做。所以我写了一个正则表达式替换来替换 ' 用一个 \' 我认为应该使 ' 一个文字。就替换而言,它可以工作,但它仍然标记字符串的结尾,我收到错误
解析查询时出错。 [令牌行号=1,令牌行偏移量=71,错误令牌=Brian]
我理解错误,单引号标记了要输入的字符串的结尾,而将字符串的其余部分 Brian 放在引号之外。
我正在使用的代码:
Regex reg = new Regex("\'");
firstName = reg.Replace(firstName, "\\'");
lastName = reg.Replace(lastName, "\\'"):
然后选择查询是用string.format构建的
sqlInsertObj.CommandText = string.Format("INSERT INTO childNameId (childFName, childLName) VALUES ('0', '1')", fName, lName);
sqlInsertObj.ExecuteNonQuery();
这适用于任何条目,除非名称中有引号。
【问题讨论】:
【参考方案1】:最好使用参数化的 sql 查询,而不是使用字符串连接来构建它们。文档和示例可以在 MSDN 找到。
如果您坚持字符串连接,请使用双单引号而不是 \。
firstName = firstName.Replace("'", "''" );
【讨论】:
好的,谢谢。我试图将我过去使用 mysql 的方式转换为 sql ce。奇怪的是,双引号仍然会引发异常。谢谢,我将研究参数化的 sql 查询。有什么更好的理由吗? 参数化查询是您应该这样做的唯一方法。它们避免的问题不仅仅是单引号。如果您不使用它们,这也是一个安全问题,因为它会让您更容易受到 SQL 注入攻击 @Sander:感谢您解释我所说的“更好”是什么意思。我写得有点快。 @Dusty:你有同样的例外吗?而且mysql还支持参数化查询。我过去用过。 参数化查询可防止 sql 注入,这是否意味着在将数据插入数据库之前,我不需要编写只允许某些字符的正则表达式?不,例外与没有列有关,这就像我试图插入 3 个单独的值,但只定义了两列供它们进入。因此,由于某种原因,双单引号没有充当转义字符,而是标记值的结尾。以上是关于sql ce escape '(单引号) C#的主要内容,如果未能解决你的问题,请参考以下文章
带单引号的 Mysqli_real_escape_string - 安全吗? [复制]