Castle.ActiveRecord 使用 存储过程 返回实体类
来源:互联网 发布:淘宝药房旗舰店靠谱吗 编辑:程序博客网 时间:2024/05/19 18:00
这几日就在研究这个问题
寻遍网上,也没找到个解决方法只有 在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来关联类,只能按存储过程中的字段来建一个新类,或将原实体类扩展
困了,想不出来了,有兴趣的同学自己试试吧
- Castle.ActiveRecord 使用 存储过程 返回实体类
- Castle.ActiveRecord 使用 存储过程 返回实体类
- Castle.ActiveRecord 使用 存储过程 返回实体类
- Castle ActiveRecord使用笔记
- [Castle ActiveRecord] 2. ActiveRecord
- 在Castle ActiveRecord中使用NHibernate
- Castle ActiveRecord 中使用Access数据库
- 使用CASTLE.ActiveRecord的注意事项之一:总览
- 使用Castle.ActiveRecord的注意事项三:继承
- Castle ActiveRecord中CountQuery的使用
- 使用Castle.ActiveRecord的注意事项之一:总览
- WPF使用Castle.ActiveRecord的简单示例
- 使用Castle.ActiveRecord框架的一些问题
- 存储过程实体类
- 存储过程实体类
- castle Nhibernate调用存储过程
- Castle ActiveRecord 学习 123
- Castle ActiveRecord 介绍
- 李开复写给中国大学生的七封信【3/7】
- Linux查看文件句柄占用多的进程
- 李开复写给中国大学生的七封信【4/7】
- 李开复写给中国大学生的七封信【5/7】
- 简单看AfxOleInit()的内部工作~~
- Castle.ActiveRecord 使用 存储过程 返回实体类
- 李开复写给中国大学生的七封信【6/7】
- Drawable、Bitmap、byte[]之间的转换问题
- 还没有脱离Revit平台运行的Revit插件
- ORACLE建立恢復目錄CataLog
- 索引失效问题
- 李开复写给中国大学生的七封信【7/7】
- 解析SQL Server 2000的“设备激活错误”
- ios4支持高分辨率的一些总结