为什么我的sql命令不接受表名的带引号的标识符?

时间:2016-01-20 11:20:14

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

我想让我的sql查询防弹,并找到关于清理表/列名称的this问题。

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

我的表格名称为private static double scheduledHour = 10; private static DateTime scheduledTime; public WinService() { scheduledTime = DateTime.Today.AddHours(scheduledHour);//setting 10 am of today as scheduled time- service start date } private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { DateTime now = DateTime.Now; if (scheduledTime < DateTime.Now) { TimeSpan span = now - DateTime.Now; scheduledTime = scheduledTime.AddMilliseconds(span.Milliseconds).AddDays(1);// this will set scheduled time to 10 am of next day while correcting the milliseconds //do the scheduled task here } } ,因此我将其传递给了foo.Bar的{​​{1}}方法,它又给了我CommandBuilder

当我致电QuoteIdentifier时,它会抱怨此表格不存在。所以我试着最初将表名定义为[foo.Bar]。在这种情况下,(string)cmd.ExecuteScalar();会创建[foo].[Bar],但也无效。

唯一有效的方法是在不使用QuoteIdentifier方法的情况下仅指定[[foo]].[Bar]]]

此时我想知道我是否可以使用它来保护我的查询?它并没有太大用处,调整引用的查询,如another answer表明也似乎没有。

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

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

QuoteIdentifier

1 个答案:

答案 0 :(得分:2)

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

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

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

这样做的原因应该是显而易见的 - 对于引用的标识符来说,使用.作为名称的一部分是完全有效的。这就是首先引用的重点。