2008-10-09 16 views
8

Creo que hay un debate sobre este tema en algún lugar de la red, pero perdí la URL y no puedo encontrarlo a través de Google.¿Cómo se ejecuta un procedimiento almacenado utilizando Castle ActiveRecord?

Lo que podría tratar en este momento sería:

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); 
} 

Sin embargo, no estoy muy seguro de si esta es la forma correcta de hacer esto o si acaso existe una mejor manera.

Respuesta

1

También puede obtener una IDbConnection con:

ActiveRecordMediator.GetSessionFactoryHolder() 
    .GetSessionFactory(typeof(ActiveRecordBase)) 
    .ConnectionProvider.GetConnection(); 
+0

Consulte las Preguntas frecuentes sobre ActiveRecord: http://using.castleproject.org/display/AR/FAQ –

+0

Esto no parece funcionar, dice que ConnectionProvider no existe. – Justin

2

Esto funciona para mí (procedimiento almacenado con parametros y tabla de resultados dinámico):

// 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)); 
} 
0

Para ActiveRecord versión 1, esto funciona:

IDbConnection connection = ActiveRecordMediator.GetSessionFactoryHolder() 
          .GetSessionFactory(typeof(ActiveRecordBase)) 
          .OpenSession().Connection; 
-1
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"); 
    } 
Cuestiones relacionadas