2008-10-09 5 views
8

Tôi tin rằng có một cuộc thảo luận về chủ đề này một nơi nào đó trên mạng nhưng tôi bị mất url và tôi không thể tìm thấy nó thông qua googling.Làm thế nào để bạn thực hiện một thủ tục được lưu trữ bằng cách sử dụng Castle ActiveRecord?

Những gì tôi có thể thử ngay bây giờ sẽ là:

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

Tuy nhiên, tôi không hoàn toàn chắc chắn nếu điều này là đúng cách để làm điều này hoặc nếu có lẽ là một cách tốt hơn tồn tại.

Trả lời

1

Blog tôi đã sử dụng khi thực hiện các thủ tục được lưu trữ trong mã ActiveRecord của tôi là bài đăng này của Rodj (http://blog.rodj.org/archive/2008/05/23/activerecord-nhibernate-and-sql-stored-procedures.aspx). Sử dụng bài đăng của anh ấy và các bình luận tôi có thể làm việc này. Tôi chưa quyết định xem đây có phải là cách tốt nhất hay không.

+4

liên kết đó bị hỏng ... –

1

Bạn cũng có thể nhận được một IDbConnection với:

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

Kiểm tra câu hỏi thường gặp ActiveRecord: http://using.castleproject.org/display/AR/FAQ –

+0

Điều này dường như không hoạt động, nó nói rằng ConnectionProvider không tồn tại. – Justin

2

này làm việc cho tôi (stored procedure với params và bảng kết quả động):

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

Đối với ActiveRecord phiên bản 1, công trình này:

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