【问题标题】:Why isn't my sql command accepting a quoted identifier for a table name?为什么我的 sql 命令不接受表名的带引号标识符?
【发布时间】:2016-04-26 05:09:25
【问题描述】:

我想做我的 sql 查询防弹,发现this关于清理表/列名的问题。

我听从了建议,但不知何故,它没有按预期工作。

我的表名是foo.Bar,所以我将它传递给CommandBuilderQuoteIdentifier 方法,它给了我[foo.Bar]

当我打电话给(string)cmd.ExecuteScalar(); 时,它抱怨这个表不存在。所以我最初尝试将表名定义为[foo].[Bar]。在这种情况下,QuoteIdentifier 创建了 [[foo]].[Bar]]],这也不起作用。

唯一有效的是我只指定[foo].[Bar] 而不使用QuoteIdentifier 方法。

此时我想知道是否可以使用它来保护我的查询?它没有多大用处,并且调整像another answer 这样的引用查询似乎也不正确。

我能做些什么来保护查询并使其工作并接受名称[foo].[Bar] 而不会破坏它?

这就是我创建查询的方式:

cmd.CommandText = string.Format(
    "SELECT {0} FROM {1} WHERE {2} = '{3}'{4}",
    ...,
    sanitizedTableName, // only [foo].[Bar] works -- [[foo]].[Bar]]] and [foo.Bar] fail
    ...,
    ...,
    ...);

【问题讨论】:

  • 你试过SqlParameter吗? msdn.microsoft.com/en-us/library/…
  • @buffjape 我打算稍后将它用于{3} 值。我也可以用它来插入表名吗?我从来没有尝试插入任何其他东西。我想这是我见过的唯一用法......我会尝试一下,我们马上就会看到;-)
  • 如果您使用参数化查询,则不需要引号。只需添加一个参数并指定数据库中列的类型即可。
  • @Gnqz 这不是我遇到问题的参数(稍后我将使用参数)。目前它不喜欢表名,但我会尝试使用它们作为它的名称,就像 buffjape 建议的那样。我不知道我也可以将它们用于表名。
  • 问题是,您的表名不是 foo.bar。您的表的名称是 bar 并且它在 foo 模式中。尝试使用只希望处理表名的函数对其进行清理将会失败,因为它们会假设 . 是名称的一部分而不是分隔符。

标签: c# sql-server tsql quoted-identifier


【解决方案1】:

问题是表的名称是bar,而不是foo.bar。您正在使用多部分标识符 - foo 是架构,bar 是表名。

要获得正确的引用,您需要分别引用每个标识符:

QuoteIdentifier(schemaName) + "." + QuoteIdentifier(tableName)

这样做的原因应该很明显 - 带引号的标识符使用 . 作为名称的一部分是完全有效的。这就是首先引用的全部意义所在。

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2020-02-13
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多