【问题标题】:How do you execute a stored procedure using Castle ActiveRecord?如何使用 Castle ActiveRecord 执行存储过程?
【发布时间】:2008-10-09 17:12:08
【问题描述】:

我相信网上某处有关于这个主题的讨论,但我丢失了网址,我无法通过谷歌搜索找到它。

我现在可能会尝试的是:

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

但是,我不太确定这是否是正确的方法,或者是否存在更好的方法。

【问题讨论】:

    标签: c# .net stored-procedures castle-activerecord


    【解决方案1】:

    这对我有用(带有参数和动态结果表的存储过程):

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

    【讨论】:

      【解决方案2】:

      我在 ActiveRecord 代码中实现存储过程时使用的博客是 Rodj (http://blog.rodj.org/archive/2008/05/23/activerecord-nhibernate-and-sql-stored-procedures.aspx) 的这篇文章。使用他的帖子和 cmets,我能够让它发挥作用。我还没有决定这是否是最好的方法。

      【讨论】:

        【解决方案3】:

        您还可以通过以下方式获得 IDbConnection:

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

        【讨论】:

        • 这似乎不起作用,它说 ConnectionProvider 不存在。
        【解决方案4】:

        对于 ActiveRecord 版本 1,此方法有效:

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

        【讨论】:

          【解决方案5】:
          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");
              }
          

          【讨论】:

            猜你喜欢
            • 2020-02-11
            • 2011-01-29
            • 2020-08-18
            • 1970-01-01
            • 1970-01-01
            • 2010-12-23
            • 2013-05-14
            • 2013-12-06
            • 2012-04-16
            相关资源
            最近更新 更多