1

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

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

我的表名是foo.Bar所以我将它传递给CommandBuilder'QuoteIdentifier方法并[foo.Bar]返回给我。

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

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

在这一点上,我想知道是否可以使用它来保护我的查询?它没有多大用处,并且像另一个答案所暗示的那样调整引用的查询似乎也不正确。

我能做些什么来保护查询并使其工作并接受名称[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
    ...,
    ...,
    ...);
4

1 回答 1

2

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

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

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

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

于 2016-01-20T11:55:37.083 回答