0

Я разрабатываю приложение MVC в .net и хочу использовать Castle ActiveRecord. Я попытался с SQL-запросом, он отлично работает. Я попытался использовать хранимую процедуру, но она не сработала. Могу ли я использовать хранимые процедуры в Castle ActiveRecord?Замок ActiveRecord с использованием хранимых процедур

+0

Пожалуйста, добавьте детали того, что вы попробовали, включая код и любые ошибки. – geedubb

ответ

0

Вот пример, который использует Generics:

1  public virtual IList<T> ExecuteSqlProc<T>(string sqlProc, IDictionary<string, object> parameters) 
    2  { 
    3   var targetType = typeof(T); 
    4 
    5   var holder = ActiveRecordMediator.GetSessionFactoryHolder(); 
    6   var config = holder.GetConfiguration(holder.GetRootType(targetType)); 
    7   var session = config.BuildSessionFactory().OpenStatelessSession(); 
    8 
    9   var parameterNames = GetParameterNames(sqlProc); 
    10 
    11   IQuery query; 
    12   try 
    13   { 
    14    query = session.GetNamedQuery(sqlProc); 
    15   } 
    16   catch (MappingException) 
    17   {     
    18    var paramlist = string.Empty; 
    19 
    20    foreach (var parameterName in parameterNames) 
    21    { 
    22     paramlist += ":" + parameterName +", "; 
    23    } 
    24 
    25    paramlist = paramlist.TrimEnd(new[] {' ', ','}); 
    26 
    27    var sqlQueryMapping = @"<sql-query name='{0}'><return class='{1}' />EXEC dbo.{0} {2}</sql-query>"; 
    28 
    29    var sqlQuery = string.Format(sqlQueryMapping, sqlProc, targetType.Name, paramlist); 
    30 
    31    var mapping_hbm_xml = 
    32     string.Format(@"<hibernate-mapping xmlns='{0}' assembly='{1}' namespace='{2}'>{3}</hibernate-mapping>", 
    33        Configuration.MappingSchemaXMLNS, targetType.Assembly.FullName, targetType.Namespace, sqlQuery); 
    34 
    35    config.AddXmlString(mapping_hbm_xml); 
    36 
    37    session = config.BuildSessionFactory().OpenStatelessSession(); 
    38    query = session.GetNamedQuery(sqlProc); 
    39   } 
    40 
    41   foreach (var parameterName in parameterNames) 
    42   { 
    43    if(parameters.ContainsKey(parameterName)) 
    44    { 
    45     query.SetParameter(parameterName, parameters[parameterName]); 
    46    } 
    47    else 
    48    { 
    49     query.SetParameter(parameterName, "null"); 
    50    } 
    51   } 
    52 
    53   return query.List<T>(); 
    54  } 
    55 
    56  private static readonly Dictionary<string,string[]> parameterlist = new Dictionary<string, string[]>(); 
    57  private static string[] GetParameterNames(string sqlProc) 
    58  { 
    59   if (!parameterlist.ContainsKey(sqlProc)) 
    60   { 
    61    var session = new ARContext().Session; 
    62    IList<string> returnObj = new List<string>(); 
    63    IDbConnection conn; 
    64    IDbCommand cmd = null; 
    65 
    66    try 
    67    { 
    68     conn = session.Connection; 
    69     cmd = conn.CreateCommand(); 
    70     cmd.CommandText = 
    71      "SELECT p.name FROM sys.objects AS o INNER JOIN sys.parameters AS p ON o.object_id = p.object_id WHERE o.object_id = OBJECT_ID('" + 
    72      sqlProc + "')"; 
    73     cmd.CommandType = CommandType.Text; 
    74 
    75     using (IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
    76     { 
    77      while (reader.Read()) 
    78      { 
    79       returnObj.Add(reader.GetString(0)); 
    80      } 
    81     } 
    82    } 
    83    catch (Exception ex) 
    84    { 
    85     throw new ActiveRecordException("Could not perform GetParameters for " + sqlProc, ex); 
    86    } 
    87    finally 
    88    { 
    89     if (cmd != null) cmd.Dispose(); 
    90    } 
    91 
    92    parameterlist.Add(sqlProc, returnObj.ToArray()); 
    93   } 
    94 
    95   return parameterlist[sqlProc]; 
    96 
    97  } 
    98 
    99 } 

Источник: blog.rodj.org, May 2008 via WayBackMachine

+0

Он не работает для простых типов, таких как bool или int – Nobody

 Смежные вопросы

  • Нет связанных вопросов^_^