2010-05-26 93 views
0

我想执行使用亚音速以下查询:亚音速选择MSDB

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 
+0

你会得到什么错误? db是否在同一台服务器上? – hgulyan 2010-05-26 13:08:12

+0

当我准备查询时,我没有FROM部分中的任何表。是的,都在同一台服务器上。 – 2010-05-26 13:09:59

+0

尝试选择*从[msdb]。[dbo]。[restorehistory] ​​ 您是否得到任何结果? – hgulyan 2010-05-26 13:11:29

回答

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类试图从你指定的表名查询模式(为了能够获得限定名等,失败并吞下(或者只是ignories表)在构建查询字符串,不包括例外,你的表,因为它从未被添加到FromTables收集

但有一个快速的解决方案,应该工作:

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

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