Я разрабатываю приложение MVC в .net и хочу использовать Castle ActiveRecord. Я попытался с SQL-запросом, он отлично работает. Я попытался использовать хранимую процедуру, но она не сработала. Могу ли я использовать хранимые процедуры в Castle ActiveRecord?Замок ActiveRecord с использованием хранимых процедур
0
A
ответ
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
Пожалуйста, добавьте детали того, что вы попробовали, включая код и любые ошибки. – geedubb