procedimientos - ejecutar stored procedure c#
¿Cómo se ejecuta un procedimiento almacenado utilizando Castle ActiveRecord? (5)
El blog que utilicé al implementar procedimientos almacenados en mi código ActiveRecord fue esta publicación de Rodj ( http://blog.rodj.org/archive/2008/05/23/activerecord-nhibernate-and-sql-stored-procedures.aspx ) . Usando su publicación y los comentarios, pude hacer que esto funcionara. No he decidido si esta es la mejor manera.
Creo que hay una discusión sobre este tema en algún lugar de la red, pero perdí la URL y no puedo encontrarla en Google.
Lo que podría intentar ahora 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 hacerlo o si tal vez existe una mejor manera.
También puede obtener una IDbConnection con:
ActiveRecordMediator.GetSessionFactoryHolder()
.GetSessionFactory(typeof(ActiveRecordBase))
.ConnectionProvider.GetConnection();
Esto funciona para mí (procedimiento almacenado con parámetros y tabla de resultados dinámicos):
// 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));
}
Para ActiveRecord versión 1, esto funciona:
IDbConnection connection = ActiveRecordMediator.GetSessionFactoryHolder()
.GetSessionFactory(typeof(ActiveRecordBase))
.OpenSession().Connection;
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");
}