2008-10-09 9 views
8

मेरा मानना ​​है कि नेट पर कहीं भी इस विषय पर चर्चा है लेकिन मैंने यूआरएल खो दिया है और मैं इसे गुगलिंग के माध्यम से नहीं ढूंढ पा रहा हूं।कैसल ActiveRecord का उपयोग कर संग्रहीत प्रक्रिया को कैसे निष्पादित करते हैं?

क्या मैं अभी कोशिश कर सकते हैं होगा:

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

हालांकि, मैं काफी यकीन है कि अगर यह यह करने के लिए सही तरीका है या अगर शायद एक बेहतर तरीका मौजूद नहीं कर रहा हूँ।

उत्तर

1

ब्लॉग जो मैंने अपने ActiveRecord कोड में संग्रहित प्रक्रियाओं को लागू करते समय उपयोग किया था, यह पोस्ट रॉडज (http://blog.rodj.org/archive/2008/05/23/activerecord-nhibernate-and-sql-stored-procedures.aspx) द्वारा पोस्ट किया गया था। अपनी पोस्ट और टिप्पणियों का उपयोग करके मैं इसे काम करने में सक्षम था। मैंने फैसला नहीं किया है कि यह अभी तक का सबसे अच्छा तरीका है।

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

वह लिंक टूटा हुआ है ... –

1

तुम भी साथ एक IDbConnection प्राप्त कर सकते हैं

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

ActiveRecord FAQ देखें: http://using.castleproject.org/display/AR/FAQ –

+0

यह काम नहीं प्रतीत होता है, यह कहता है कि कनेक्शनप्रोवाइडर मौजूद नहीं है। – Justin

2

यह मेरे लिए काम करता (पैरामीटर और गतिशील परिणाम तालिका के साथ संग्रहीत प्रक्रिया):

// 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

ActiveRecord संस्करण 1 के लिए, यह काम करता है:

-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"); 
    } 
संबंधित मुद्दे

 संबंधित मुद्दे