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[])".

  • 相关阅读:
    WPF中DataGrid的应用-绑定,增改删,分页,样式
    每隔一秒获取时间
    常识
    VS2013程序打包部署详细图解
    Vs2010 WPF 项目打包
    WPF InkCanvas 画图 基础使用教程
    WPF Template模版之寻找失落的控件【三】
    WPF Template模版之DataTemplate与ControlTemplate【一】
    WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】
    淡入效果
  • 原文地址:https://www.cnblogs.com/shiningrise/p/887355.html
Copyright © 2011-2022 走看看