用AR执行sql

本文介绍了一种在NHibernate中执行T-SQL命令的方法。通过创建一个继承自ActiveRecordBaseQuery的派生类,并重写Execute方法来实现T-SQL命令的执行。此外,还提供了一个更简洁的执行SQL命令的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值