【问题标题】: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();

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

【问题讨论】:

    标签: c# regex visual-studio-2010 insert sql-server-ce


    【解决方案1】:

    最好使用参数化的 sql 查询,而不是使用字符串连接来构建它们。文档和示例可以在 MSDN 找到。

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

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

    【讨论】:

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