Subsonic SELECT FROM msdb

时间:2010-05-26 13:03:09

标签: sql-server subsonic

我想使用Subsonic执行以下查询:

SELECT MAX([restore_date]) FROM [msdb].[dbo].[restorehistory]

虽然聚合部分对我来说很容易,但问题在于表的名称。我应该如何强制Subsonic从默认数据库中选择不同的数据库。

更多详情:

这是我在我的程序中这样做的方式:

SqlQuery query = new Select(Aggregate.Max(@"restore_date",@"restore_date")).From(@"msdb.dbo.restorehistory");
return query.ExecuteScalar<DateTime>();

我得到的例外:

Need to have at least one From table specified

1 个答案:

答案 0 :(得分:1)

你试过了吗?

DateTime result = new Select(Aggregate.Max(@"restore_date",@"restore_date"))
       .From<RestoreHistory>()
       .ExecuteScalar<DateTime>();

使用

总是一个好主意
SqlQuery query = new Select(...),
String queryString = query.BuildSqlStatement();

如果出现问题。
queryString将是一个参数化的Sql语句。

编辑:

你真的不应该使用SubSonic的字符串。 你可以使用

RestoreHistory.Columns.RestoreDate  // = restore_date
RestoreHistory.RestoreDateColumn.QualifiedName
// = [msdb].[dbo].[restorehistory].[restore_date] (not sure about this one, just try it out)

And

RestoreHistory.Schema.TableName     // = RestoreHistory
RestoreHistory.Schema.QualifiedName // = [msdb].[dbo].[restorehistory]

从DAL获取字符串。 否则,在从数据库重命名/删除列并重新创建SubSonic DAL后,您将不会遇到编译时错误。

EDIT2:

我刚刚读到您要查询另一个数据库中的表,而不是用于生成DAL的数据库。 我以前从未这样做过,但我想这不起作用的原因是因为subsonics的SqlQuery类试图从你指定的表名中查询模式(能够获得限定名称等,失败并吞下异常) (或者只是忽略了表格。)在构建查询字符串时,不包括您的表格,因为它从未添加到FromTables集合中。

但是有一个快速的解决方案应该有效:

DateTime result = new SubSonic.InlineQuery()
     .ExecuteScalar<DateTime>(
       "SELECT MAX([restore_date]) FROM [msdb].[dbo].[restorehistory]"
      );

或者,如果您经常需要访问其他数据库,您甚至可以在一个项目中创建另一个提供程序并使用两个DAL。