zoukankan      html  css  js  c++  java
  • 用AR执行sql

    摘自: http://forum.castleproject.org/viewtopic.php?t=52

    Hi, I got somewhat the same problem. I need to run T-SQL commands, as we are new to ActiveRecord and NHibernate, and would like a quick "workaround" when we can't find our ways Razz

    I refered to http://castleproject.org/index.php/ActiveRecord:Using_HQL and made a derived class from ActiveRecordBaseQuery.

    Code:
    Public Class SqlNonQuery
        Inherits ActiveRecordBaseQuery

        Private _commandText As String
        Public Property CommandText() As String
            Get
                Return _commandText
            End Get
            Set(ByVal Value As String)
                _commandText = Value
            End Set
        End Property

        Public Sub New(ByVal commandText As String)
            MyBase.New(GetType(User))

            _commandText = commandText

        End Sub

        Public Overrides Function Execute(ByVal session As NHibernate.ISession) As Object
            Dim cmd As IDbCommand = session.Connection.CreateCommand()
            cmd.CommandText = CommandText
            cmd.ExecuteNonQuery()
            Return Nothing
        End Function

    End Class


    ''' usage '''
    Dim q As SqlNonQuery("ANY SQL STATEMENT")
    ExecuteQuery(q)


    But still have the same problem as Nick, need to pass some arbitrary ActiveRecord class type for the ActiveRecordBaseQuery constructor.

    If you have better ways, please advice.. Thanks.



    Ok, I figured out something that works:

    Code:

    ISessionFactoryHolder holder = ActiveRecordMediator.GetSessionFactoryHolder();
    ISession session = holder.CreateSession(typeof(User));

    IDbCommand cmd = session.Connection.CreateCommand();
    cmd.CommandText = "ALTER TABLE stops ALTER description TYPE text;";
    cmd.ExecuteNonQuery();
                
    holder.ReleaseSession(session);


    However it's a lot of code, and two things that bug me are:

    1) Must give CreateSession some arbitrary ActiveRecord class type (type "User" in the example)
    2) GetSessionFactoryHolder() seems to be a "temporary" method, not intended to be used



    This disscuss is old though, I post the idea to solve above problem. It maybe help someone who has same problem.
    Code:

    // Create query
    SimpleQuery<object[]> query = new SimpleQuery<object[]>(
                    typeof(TopCalled),
                    @"select RecID, count(Called_Number) as frequency, Called_Number
                                           from detail_record
                                           group by Called_Number
                                           order by frequency desc");

    // Execute query
    object[][] results = query.Execute();


    It also might work that you use TopCalled class instead of "object[]" if the class has "operator=(object[])".

  • 相关阅读:
    结构与联合
    信号与槽知识点
    函数
    元对象编译器moc
    堆与栈
    More Effective C++ (虚拟构造函数)
    重载 覆盖 隐藏
    继承专题
    PowerDesigner 的常用方法(转)
    搜狗输入法导入Google词库bug
  • 原文地址:https://www.cnblogs.com/shiningrise/p/887355.html
Copyright © 2011-2022 走看看