这几日就在研究这个问题
寻遍网上,也没找到个解决方法只有 在NHibernate里执行存储过程
里面操作NHibernate的一点方法
于是动手写成了以下这个类
当然,只能保证测试可以通过,可能还有很多问题,要一个一个解决
namespace ChAlumna.CastleExt
{
using Castle.ActiveRecord;
using Castle.ActiveRecord.Framework;
using Castle.ActiveRecord.Framework.Config;
using System;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Expression;
using System.Collections.Generic;
using System.Text;
using System.Data;
public class Execute
{
/** <summary>
/// 使用存储过程填充实体类,邹健,2008 1 24
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="spname">存储过程名</param>
/// <param name="idict">参数字典</param>
/// <returns>一个实体类Ilist</returns>
public static IList<T> GetList<T>(string spname, IDictionary<String, Object> idict) {
Type type = typeof(T);
//Chsword.DoDataBase d = new Chsword.DoDataBase();
StringBuilder sp = new StringBuilder();
foreach (string key in idict.Keys) {
sp.AppendFormat(":{0},", key);
}
if (sp.Length != 0)
sp.Length--;
string map = String.Format(@"<sql-query name='{0}'>
<return class='{1}'/>
exec {0} {2}
</sql-query>",
spname,
type.Name,
sp.ToString()
);
Execute.CreateQueryMapping(type, map);//创建一个SQL-Query
ISessionFactoryHolder holder = ActiveRecordMediator.GetSessionFactoryHolder();
ISession session = holder.CreateSession(type);
IQuery query = session.GetNamedQuery(spname);
foreach (string key in idict.Keys) {
query = query.SetParameter(key, idict[key]);
}
return query.List<T>();
}
/** <summary>
/// 创建一个Sql-Query
/// </summary>
/// <param name="type">类型,做为Key</param>
/// <param name="xml">Sql-Query结点</param>
public static void CreateQueryMapping(Type type, string xml) {
ISessionFactoryHolder holder = ActiveRecordMediator.GetSessionFactoryHolder();
Configuration config = holder.GetConfiguration(holder.GetRootType(type));
// xml = ;
config.AddXmlString(
string.Format("<hibernate-mapping xmlns='{0}' assembly='{1}' namespace='{2}'>{3}</hibernate-mapping>",
Configuration.MappingSchemaXMLNS,
type.Assembly.FullName,
type.Namespace,//命名空间
xml//内容即<Sql-Query />
)
);
//return config.NamedSQLQueries.Count.ToString();
}
}
}
使用方法如下
IDictionary<string,object> p=new Dictionary<string,Object>();//参数
p.Add("userid", 10000);//参一
p.Add("id", 17002);//参二
p.Add("groupid", 51);//参三
PropertyBag.Add("list",
ChAlumna.CastleExt.Execute.GetList<LogToAccount>(//执行
"Note_Select", p
));
PropertyBag.Add是MonoRail里的一个系统字典,这里测试很正常
但是,有以下不中足(我想到的)
参数还不能实现out
不能用Many One来关联类,只能按存储过程中的字段来建一个新类,或将原实体类扩展
困了,想不出来了,有兴趣的同学自己试试吧