代码之家  ›  专栏  ›  技术社区  ›  Lukasz Lysik

亚音速从msdb中选择

  •  0
  • Lukasz Lysik  · 技术社区  · 16 年前

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

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

    更多详细信息:

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

    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 回复  |  直到 16 年前
        1
  •  1
  •   Jürgen Steinblock    16 年前

    你试过:

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

    而且使用它总是一个好主意

    SqlQuery query = new Select(...),
    String queryString = query.BuildSqlStatement();
    

    如果出了问题。

    编辑:

    你真的不应该用亚音速的弦。 你可以用

    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之后,不会出现编译时错误。

    编辑2:

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

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

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

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

    推荐文章