Как выполнить хранимую процедуру с помощью Castle ActiveRecord? - PullRequest
8 голосов
/ 09 октября 2008

Я полагаю, что где-то в сети обсуждается эта тема, но я потерял URL и не могу найти его с помощью googling.

То, что я мог бы попробовать прямо сейчас, было бы:

ISessionFactoryHolder factoryHolder = ActiveRecordMediator<EntityClass>.GetSessionFactoryHolder();
ISession session = factoryHolder.CreateSession(typeof(EntityClass));
try
{
    IDbCommand cmd = session.Connection.CreateCommand();
    cmd.CommandText = "spName";
    cmd.ExecuteNonQuery();
}
catch(Exception ex)
{

}
finally
{
    factoryHolder.ReleaseSession(session);
}

Однако я не совсем уверен, является ли это правильным способом сделать это или, возможно, существует лучший способ.

Ответы [ 5 ]

2 голосов
/ 22 ноября 2010

Это работает для меня (хранимая процедура с параметрами и динамической таблицей результатов):

// get Connection
System.Data.IDbConnection con = ActiveRecordMediator.GetSessionFactoryHolder()
                                                    .GetSessionFactory(typeof(Autocomplete))
                                                    .ConnectionProvider.GetConnection();

// set Command
System.Data.IDbCommand cmd = con.CreateCommand();
cmd.CommandText = "name_of_stored_procedure";
cmd.CommandType = System.Data.CommandType.StoredProcedure;

// set Parameter of Stored Procedure
System.Data.SqlClient.SqlParameter param = new System.Data.SqlClient.SqlParameter("@parameter_name", System.Data.SqlDbType.NVarChar);
param.Value = "value_of_parameter";
((System.Data.SqlClient.SqlParameterCollection)cmd.Parameters).Add(param);

// call Stored Procedure (without getting result)
cmd.ExecuteNonQuery();

// ... or read results
System.Data.SqlClient.SqlDataReader r = (System.Data.SqlClientSqlDataReader)cmd.ExecuteReader();
while(r.Read()) {
    System.Console.WriteLine("result first col: " + r.GetString(0));
}
1 голос
/ 28 ноября 2008

Вы также можете получить IDbConnection с:

ActiveRecordMediator.GetSessionFactoryHolder()
    .GetSessionFactory(typeof(ActiveRecordBase))
    .ConnectionProvider.GetConnection();
1 голос
/ 19 ноября 2008

Блог, который я использовал при реализации хранимых процедур в своем коде ActiveRecord, был этот пост Родж (http://blog.rodj.org/archive/2008/05/23/activerecord-nhibernate-and-sql-stored-procedures.aspx). Используя его пост и комментарии, я смог заставить это работать. Я не решил, если это лучший способ пока.

0 голосов
/ 29 мая 2014
public ArrayList DevolverCamposDeObjetoSTP(T Objeto, List<Consulta> Consultas, string StoredProcedureName)
    {
        ArrayList results;
        try
        {
            var queryString = @"EXEC " + StoredProcedureName;
            foreach (var consulta in Consultas)
            {
                switch (consulta.tipoCampo)
                {
                    case Consulta.TipoCampo.dato:
                        queryString = queryString + " " + consulta.Campo + " = " + "'" + consulta.Valor + "'";
                        break;
                    case Consulta.TipoCampo.numero:
                        queryString = queryString + " " + consulta.Campo + " = " + consulta.Valor;
                        break;
                }   
                queryString = queryString + ",";
            }
            queryString = queryString.Remove(queryString.Count() - 1, 1);
            var query = new HqlBasedQuery(typeof(T),QueryLanguage.Sql, queryString);
            results = (ArrayList)ActiveRecordMediator.ExecuteQuery(query);
        }
        catch (Exception exception)
        {
            throw new Exception(exception.Message);
        }
        return results;
    }
public class Consulta
{
    public enum TipoCampo
    {
        dato,
        numero
    }
    public string Campo { get; set; }
    public TipoCampo tipoCampo { get; set; }
    public string Valor { get; set; }
    public string Indicador { get; set; }
}
public void _Pruebastp()
    {
        var p = new Recurso().DevolverCamposDeObjetoSTP(
                                                         new Recurso(),
                                                         new List<Consulta> { new Consulta { Campo = "@nombre", tipoCampo = Consulta.TipoCampo.dato, Valor = "chr" }, new Consulta { Campo = "@perfil", tipoCampo = Consulta.TipoCampo.numero, Valor = "1" } },
                                                         "Ejemplo");
    }
0 голосов
/ 22 апреля 2011

Для ActiveRecord версии 1 это работает:

IDbConnection connection = ActiveRecordMediator.GetSessionFactoryHolder()
                          .GetSessionFactory(typeof(ActiveRecordBase))
                          .OpenSession().Connection;
...