我想让我的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
答案 0 :(得分:2)
问题是表格的名称是bar
,而不是foo.bar
。您使用的是多部分标识符 - foo
是架构,bar
是表名。
要获得正确的引用,您需要单独引用每个标识符:
QuoteIdentifier(schemaName) + "." + QuoteIdentifier(tableName)
这样做的原因应该是显而易见的 - 对于引用的标识符来说,使用.
作为名称的一部分是完全有效的。这就是首先引用的重点。