【问题标题】:Replacing single quotes in full sql queries with C#用 C# 替换完整 sql 查询中的单引号
【发布时间】:2015-12-10 05:38:46
【问题描述】:

在我们的 C# 桌面应用程序中,我们生成了许多动态 sql 查询。现在我们在字符串中使用单引号会遇到一些麻烦。这是一个示例:

INSERT INTO Addresses (CompanyName) VALUES ('Thomas' Imbiss')

我的问题是:如何查找和替换字符串中两个其他单引号之间的所有单引号?不幸的是,在创建不同的查询时我无法替换单引号。我只能在创建完整查询之后和执行查询之前执行此操作。

我试过这个模式(Regular Expressions):“\w\'\w”

但是这种模式不起作用,因为在“s”之后有一个空格而不是一个字符。

【问题讨论】:

  • 我猜你的查询比这个复杂得多。恐怕这里没有 100% 安全的方法。除非您在这里找到适合您的模式(用文字表达),否则很难提出任何建议。
  • 您可以使用双引号代替单引号来赋予价值。您可以像这样使用上面的查询:INSERT INTO Addresses (CompanyName) VALUES ("Thomas' Imbiss")
  • 我会评估成本:您花在调整模式匹配表达式上的时间来跟踪所有将发生的情况并修补所有错误(如果您能捕获所有错误......)与使用参数动态 sql 与一次重写应用程序一个组件/类以使用存储过程。
  • 如果您在构建字符串时知道这些值是什么,那么简单的myValue.Replace("'", "''") 就可以工作(双引号将它们转义)。显然这需要单独插入到查询中,否则外部引号也会被转换......
  • @stribizhev 当然,这只是一个例子。哦,我认为Regex 应该可以做到这一点。

标签: c# sql sql-server regex


【解决方案1】:

很抱歉,您期望的方法没有解决方案。

例如,有这些列和值:

  • A 列,值,A',
  • B 列,值,B',

如果它们在列列表中,则您有',A',',',B','

现在,第一个值和第二个值之间的界限在哪里? 这是模棱两可的。

为 SQL 创建文本字段时必须采取措施。要么使用 SQL 参数,要么在此处正确转义 qoutes 和其他有问题的字符。

考虑向经理展示上述模棱两可的示例,将整个问题推回为算法上无法解决的您的最终。或者提供实施猜测工作,并询问他们是否会在某些情况下混合多个文本字段的内容(例如上述情况)感到高兴。


在创建 SQL 查询时,如果他们不想开始使用 SQL 参数,则引用任何 input 字符串的解决方案就像替换一样简单:

string Enquote(string input)
{
    return input.All(c => Strings.AscW(c) < 128) ? "'" : "N'"
            + input.Replace("'", "''")
            + "'"
}

当然,故意使用格式错误的 Unicode 字符串(隐藏 ' 的代理对)可能会出现问题,但通常不可能通过用户界面生成这些字符串。通常,这仍然比将所有查询转换为带有 SQL 参数的版本要快。

【讨论】:

  • 我同意。我在这个问题上工作和思考的时间越多,我发现的问题就越多。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2010-11-29
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多