NHibernate初学者指南,常用成效总汇

做事中有这么三个急需,有N张分裂的表格,每张报表对应二个数据源,总括数据接纳内部存款和储蓄器方式,首先在内在里定义了数据源对应实体。计算标准用lamdba表明式式实现,通过工具对单元格举行定义。在促成进程中针对每一张表来写取数字呈现示是很Low的了,取数条件定义都以平整的,总括实现正是一段C#代码,可是要针对性区别的数据源也正是差异的List<Entity>,通过钻研究开发现经过泛型和反光能够兑现。

1.常用控件

美高梅开户网址 1文本框:输入文字或表明式

美高梅开户网址 2报表:设置表格的种类数,输入数字或表明式

美高梅开户网址 3子报表:放置子报表后,系统会活动扩充三个页面,你能够在此页面上设计供给的表格。系统在打字与印刷处理时,先按主报表打字与印刷,当境遇子报表时会自动转入子报表的页面实行打字与印刷处理,完毕后持续执行主报表打字与印刷的办事,所以大家又称为嵌套报表。

美高梅开户网址 4复选框:依据布尔说明式是不是为ture来呈现是否 √

美高梅开户网址 5条形码:绑定扫描码,一般Type为Code12八

美高梅开户网址 6交叉表:Matrix

美高梅开户网址 7页面设置:设置纸张大小及页边距

美高梅开户网址 8边框设置:设置是不是出示上下左左边框以及边框线条的安装

美高梅开户网址 9边框宽度:下拉三角能够选择边框宽度设置

非类型化的尺度查询

咱俩从概念规则查询的根起始,代码如下所示:

var query = session.CreateCriteria<Product>();

CreateCriteria方法再次来到2个已毕了ICriteria接口的靶子。假如得到具有成品的列表,那么大家需求动用接口ICriteria的List<T>方法,如上面包车型地铁代码所示:

var products = session.CreateCriteria<Product>().List<Product>();

List<Product>()方法重回IList<Product>。和LINQ to
NHibernate相比较,当List方法被调用时查询立即施行。

理所当然还有叁个非泛型的List法兰西共和国法定义在ICriteria接口上。这几个方法再次来到三个IList类型的对象。

1.常用控件

 

   
  美高梅开户网址 10文本框:输入文字或表明式

   
  美高梅开户网址 11报表:设置表格的行列数,输入数字或表明式

     
美高梅开户网址 12子报表:放置子报表后,系统会自行扩充1个页面,你能够在此页面上规划要求的表格。系统在打字与印刷处理时,先按主报表打字与印刷,当遭遇子报表时会自动转入子报表的页面进
     
行打字与印刷处理,达成后继续执行主报表打字与印刷的做事,所以我们又称为嵌套报表。

   
  美高梅开户网址 13复选框:依照布尔表明式是或不是为ture来显示是或不是 √(如性别男女)

   
  美高梅开户网址 14条形码:绑定扫描码(如静滴单),1般Type为Code12八 

           
  美高梅开户网址 15交叉表:Matrix

     
     
  美高梅开户网址 16页面设置:设置纸张大小及页边距

     
     
  美高梅开户网址 17边框设置:设置是或不是出示上下左左侧框以及边框线条的安装

     
     
  美高梅开户网址 18边框宽度:下拉三角可以选用边框宽度设置

 

听他们讲字符串获取实体类型

二.常用报表栏

报表标题区(ReportTitle):仅在首先页突显在纸张的上部。1般用来打字与印刷表格的标题等音信。

报表合计(ReprotSummary):仅体以往具备数据的最终末尾。壹般用于打字与印刷总计音讯等。

页眉(PageHeader):显示在每页的最上部。通过安装你能够让它内置报表抬头之上或然之下。1般用于打印页眉音讯等。

数据区:绑定数据源呈现数据。

多少首:显示在拥有数据源的最上部,仅打字与印刷3回。一般用来呈现相关摘要新闻,与页眉的区分是当该页无数据时,数据首的内容不显示且仅体现3回。

数据尾:显示在装有数据源的最上边,仅打字与印刷二回。1般用于呈现全数数据的协商消息。

栏首(ColumnHeader):呈现在每页数据源的上部,它在每页均显得。由此壹般用来打字与印刷数据源字段的栏目信息。

栏尾(ColumnHeader):突显在每页数据源的底下,它在每页均展现。一般可用于总结展现每页数据的页合计消息。

分组页眉(GroupHeader):用于显示分组数据,在每一个分组起先显示。

分组页脚(GroupFooter):与群组首1壹对应。一般用于展现分组数据的总结消息。

页脚(PageFooter):展现在每页的最尾部。1般用于打字与印刷页序等音信。

范围再次回到的记录数

限定查询再次回到的记录数,能够动用Set马克斯Results方法。从数据库中获得前十个产品,代码如下:

var first10Products = session.CreateCriteria<Product>()
                       .SetMaxResults(10)
                       .List<Product>();

2.常用报表栏

      

报表标题区(ReportTitle):仅在首先页突显在纸张的上部。壹般用来打字与印刷表格的标题等新闻。

 

报表合计(ReprotSummary):仅映未来具有数据的末梢末尾。1般用来打字与印刷计算消息等。

 

页眉(PageHeader):展现在每页的最上部。通过安装你能够让它内置报表抬头之上或许之下。壹般用来打印页眉音信等。

 

数据区(data):绑定数据源突显数据。

 

多少首(Header):显示在有着数据源的最上部,仅打字与印刷一回。一般用来展现相关摘要消息,与页眉的区分是当该页无数据时,数据首的内容不突显且仅呈现一遍。

 

数据尾(Footer):展现在富有数据源的最下面,仅打字与印刷一遍。1般用于体现全体数据的合计消息。

 

栏首(ColumnHeader):突显在每页数据源的上部,它在每页均显得。由此1般用于打字与印刷数据源字段的栏目消息。

 

栏尾(ColumnHeader):展现在每页数据源的上面,它在每页均呈现。壹般可用来计算展现每页数据的页合计音讯。

 

分组页眉(GroupHeader):用于体现分组数据,在每1个分组初阶体现。

 

分组页脚(GroupFooter):与群组首11对应。1般用于展示分组数据的总结信息。

 

页脚(PageFooter):显示在每页的最尾部。一般用来打印页序等信息。

 

 1 private Type getEntity(string typeName)
 2 {
 3     var workPath = AppDomain.CurrentDomain.BaseDirectory;
 4     string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 5     foreach (string file in files)
 6     {
 7         string ext = file.Substring(file.LastIndexOf("."));
 8         if (ext != ".dll") continue;
 9         try
10         {
11             Assembly asm = Assembly.LoadFile(file);
12             Type[] allTypes = asm.GetTypes();
13             foreach (Type t in allTypes)
14             {
15                 if (t.IsSubclassOf(typeof(XXDataRecord)))
16                 {
17                     if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
18                         return t;
19                 }
20             }
21         }
22         catch
23         {
24             return null;
25         }
26     }
27     return null;
28 }

NHibernate初学者指南,常用成效总汇。三.常用效应

筛选记录集

若果筛选出下架的成品,代码如下所示:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", true))
                           .List<Product>();

经过给查询添加2个或七个限制标准筛选就形成了。借使大家想取得全部需求再订购的在架产品列表,大家得以应用上边包车型地铁代码:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", false))
                           .Add(Restrictions.GeProperty("ReorderLevel", "UnitsOnStock"))
                           .List<Product>();

尽管那样很灵活,可是和LINQ to
NHibernate相比较也是万分不难出错的。要是把UnitsOnStock写成了UnitSonStock,唯有在运营时才会发现到这些荒唐。

此外,Restrictions那个静态类还有不少概念筛选标准的便利的格局。

三.常用效应

 

 

一.添加报表栏

将光标置于“设置报表拦”弹出“段编辑器”,再选用丰裕或删除段。

添加段的时候要留意:

1)选取添加段的职责,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

美高梅开户网址 19美高梅开户网址 20美高梅开户网址 21

二)若加上的数据区与原数据区平级,任选段,点击添加“数据区”即可,如图所示:

美高梅开户网址 22美高梅开户网址 23美高梅开户网址 24

照耀记录集

方今让大家谈论哪边映射记录集。那也称之为投影。使用Criteria
API未有运用LINQ方便,大家必须首先定义想要投影的字段。然后,还要定义三个transformer,它将这一个值放入到所需的靶子项目中,如上边包车型的士代码所示:

var productsLookup = session.CreateCriteria<Product>()
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Property("Id"))
                    .Add(Projections.Property("Name"))
                    )
                    .SetResultTransformer(
                    new AliasToBeanResultTransformer(typeof(NameID)))
                    .List<NameID>();

在上头的代码中,大家应用SetProjection方法定义映射。我们采用product的Id和Name属性,并将它们放入到NameID类型的对象中。类NameID定义如下:

public class NameID
{
    public int Id { get; set; }
    public string Name { get; set; }
}

大家利用AliasToBeanResultTransformer把询问结果转换为NameID对象的列表。注意指标对象的性子名称必须与投影属性的称呼相配。假若不相称,ProjectionList有3个Add的重载方法,大家得以定义3个别称。这几个小名与对象对象的名目相相配。

1.添加报表栏

 

将光标置于“设置报表拦”弹出“段编辑器”,再选用丰裕或删除段。

 

添加段的时候要专注:

 

     一)选择添加段的岗位,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

                 
 美高梅开户网址 25美高梅开户网址 26美高梅开户网址 27

       

       二)若加上的数据区与原数据区平级,任选段(除数量区外),点击添加“数据区”即可,如图所示:

                 
 美高梅开户网址 28美高梅开户网址 29美高梅开户网址 30

         

泛型方法定义

贰.添加数据源

选拔菜单栏的“数据”,在下拉框中当选“采用数据源”,弹出“选用报表数量”框,里面会列出已经不翼而飞的数据源,勾选要求的数据源,点击鲜明,此时界面左边“数据”列表中即展现当前所选中的数据源,选中数据源,右键选择“查看数据”,即可展现当前数据源中所含有的数量:

美高梅开户网址 31美高梅开户网址 32美高梅开户网址 33

美高梅开户网址 34美高梅开户网址 35

排序结果集

排序结果集格外不难。大家只需加上别的3个标准化,如上面的代码所示:

var sortedProducts = session.CreateCriteria<Product>()
                    .AddOrder(Order.Asc("Name"))
                    .List<Product>();

以相反的顺序排列产品列表,只需使用Order类的Desc方法。大家还足以依照两个属性排序,只需为各样字段添加三个排序条件即可。

二.添加数据源

 

选用菜单栏的“数据”,在下拉框中选中“选拔数据源”,弹出“选择报表数量”框,里面会列出已经传出的数据源,勾选需求的数据源,点击鲜明,此时界面左侧“数据”列表中即显示当前所选中的数据源,选中数据源,右键选用“查看数据”,即可展现当前数据源中所含有的多少:

               
  美高梅开户网址 36美高梅开户网址 37美高梅开户网址 38

               
 美高梅开户网址 39美高梅开户网址 40

 

1 public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()

叁.添加种类变量

对于一些变量大概取自当前系统,如时间,页码,序号等,此时增选系统变量中相应的变量即可,如图:

美高梅开户网址 41

分组记录集

分组在LINQ提供程序中是独自的办法,不过在criteria
API中是影子的1某些。尽管大家想依据Category分组产品和总括种种项指标成品数,我们得以采用上面包车型客车询问:

var productsGrouped = session.CreateCriteria<Product>()
                     .SetProjection(Projections.ProjectionList()
                     .Add(Projections.GroupProperty("Category"))
                     .Add(Projections.RowCount(), "Num")
                     )
                    .List();

只要非得依照用户的选料动态变化查询,criteria
API是最合适的。除了这一个之外,LINQ to
NHibernate更有着可读性以及从深远来看更有可维护性。

三.添加系列变量

对于部分变量大概取自当前系统,如时间,页码,序号等,此时甄选系统变量中相应的变量即可,如图:

                                                             
 美高梅开户网址 42

 

4.添加集中

对此有个别报表,须要在数码尾添加合计行,此时急需手动添加合计,弹出汇总项编辑器,再在集聚项编辑器中添加汇总数据源。

美高梅开户网址 43

在集中名称①栏能够自命名三个商量名称;

美高梅开户网址 44

在“数据列或公式”中得以挑选集中的数据源;

在“总结段中每1列”能够挑选插足汇总的数据区;

在“计算满意上边条件的行”中得以做过滤,在写total时会出现计量某体系型的和,比如总结总人次分在职和离退休之和,此时在写total时就要求写限制标准举办过滤。如[Table1.GRXZ]==”1″;如图:

美高梅开户网址 45

强类型的准绳查询

NHibernatet
3引进了一个新的功用正是足以选拔强类型定义规则查询。为此,QueryOver<T>参加到了ISession接口中。那里,泛型参数T表示大家想询问的实体类型。

应用QueryOver API,大家钦命询问的根,如上面的代码所示:

var query = session.QueryOver<Product>();

简简单单的取得具有成品的列表,使用如下所示的询问:

var products = session.QueryOver<Product>().List();

与Criteria API比较,QueryOver不需求内定再次来到类型。

四.添加集中

对此部分报表,须要在数码尾添加合计行,此时亟需手动添加合计,弹出汇总项编辑器,再在汇集项编辑器中添加汇总数据源。

                                     
  美高梅开户网址 46

在集中名称一栏能够自命名二个合计名称;

                                       
 美高梅开户网址 47

在“数据列或公式”中得以挑选集中的数据源;

在“总结段中每1列”能够挑选加入汇总的数据区;

在“总结满意上边条件的行”中能够做过滤,在写total时会出现计量某体系型的和,比如计算总人次分在职和退休之和,此时在写total时就须要写限制条件举行过滤。如[Table1.GRXZ]==”1″;如图:

                                                       
 美高梅开户网址 48

调用方法代码

5.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够实行数据源的抉择、排序、过滤。如图:

美高梅开户网址 49

范围重临的记录数

限定查询重临的记录数,大家能够动用Take方法。这么些查询和LINQ to
NHibernate的询问相似,如下边所示:

var first10Products = session.QueryOver<Product>()
                      .Take(10)
                      .List();

5.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够进行数据源的挑三拣4、排序、过滤。如图:

                                         
 美高梅开户网址 50

 

 1 var obj = new GenerateDataHelper(_Param);
 2 Type myGenericClassType = obj.GetType();
 3 //MakeGenericMethod 设置泛型参数类型
 4 MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
 5 int count = 0;
 6 //设置调用方法参数
 7 object[] invokeArgs = new object[] { zb, id, count };
 8 //调用
 9 var dt = (DataTable)mi.Invoke(obj, invokeArgs);
10 //获取回返数据
11 recordCount = (int)invokeArgs[9];

4.常用属性

筛选记录集

筛选记录集使用Where方法。获得全数下架产品的列表,使用上面的代码:

var discontinuedProducts = session.QueryOver<Product>()
                           .Where(p => p.Discontinued)
                           .List();

本来,大家还能够整合八个筛选,例如,获取具有在架上且要求再一次订购的产品列表,如上边包车型客车代码所示:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false)
                        .Where(p => p.ReorderLevel >= p.UnitsOnStock)
                        .List();

咱俩还足以选择上边包车型地铁方法筛选:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false &&p.ReorderLevel >= p.UnitsOnStock)
                        .List();

四.常用属性

 

1.页面安装

用来体现总的页数(TotalPages),例如:页脚彰显第二页/共20页。系统第二回扫描报表时统计出TotalPages,然后首回实际变化报表。假使不应用Doublepass,则TotalPages再次来到0,所以必须安装report的性质doublepass为true;

安装方法:点击报表树,单击报表树最上方图标,点击属性,采纳doublepass为true;也可一向在属性框中精选report,举办相关属性设置!如图:

美高梅开户网址 51美高梅开户网址 52

排序结果集

选择QueryOver
API排序和LINQ格外相似,只是LINQ定义OrderBy和OrderByDescending来定义升序和降序,而QueryOver
API只定义了多少个OrderBy方法。不过,这么些艺术必须和Asc也许Desc组合使用。当依据八个字段排序时,那两个API都有ThenBy(LINQ还有一个ThenByDescending)方法。

收获依照Name升序和UnitPrice降序排列的产品列表,代码如下所示:

var sortedProducts = session.QueryOver<Product>()
                    .OrderBy(p => p.Name).Asc
                    .ThenBy(p => p.UnitPrice).Desc
                    .List();

壹.页面设置

用以展示总的页数(TotalPages),例如:页脚展现 第一页/共20页。系统第一次扫描报表时总括出TotalPages,然后第3遍实际变化报表。如若不选取Double pass,则TotalPages重回0,所以必须安装report的性子doublepass为true;

安装方法:点击报表树,单击报表树最上方图标,点击属性,选拔doublepass为true;也可径直在属性框中采纳report,实行连锁属性设置!如图:

                                       
  美高梅开户网址 53美高梅开户网址 54

上边是全体代码,具体成效完结略过

二.打字与印刷设置

对于套打模板,样式在纸张上曾经稳定了(如处方笺、收取费用发票),只必要根据原定的样本将数据填充进去,在绘制的时候,需求用尺子特出尺寸,为了能够有1个越来越好的意义,一般把页面杪春经存在不须求再打字与印刷出来的也画出来,可是急需设置属性“printable”为false:表示打字与印刷不显示,若想在预览的时候就不要看到那叁个不须求打字与印刷的,则需安装属性“Visible”为false:表示预览不显示。

影子结果集

应用QueryOver
API定义映射也是最难的一局地。假如只想寻找全体成品的Id和Name,并将它们填充到NameID对象的数组中,能够运用上边包车型的士代码实现:

var productsLookup = session.QueryOver<Product>()
                    .Select(p => p.Id, p => p.Name)
                    .TransformUsing(Transformers.AliasToBean<NameID>())
                    .List<NameID>();

小心我们是怎么运用Select方法定义大家想投影的属性列表。每一种属性都由多少个Lamb达表明式定义,例如p=>p.Name投影Name属性。然后,大家运用TransformUsing方法注脚NHibernate怎么着转移投影结果。在头里的例证中大家挑选AliasToBean转换器表明NameID作为对象转移类型。NHibernate还定义了此外的转换器,甚至能够定义本人的转换器。静态类Transformers给出了我们可用转换器的列表。最终调用List<NameID>甘休。那里我们声解毒标项目,不然,NHibernate会认为目的项目还是是Product。

二.打字与印刷设置

对此套打模板,样式在纸张上早已固定了(如处方笺、收取费用发票),只必要遵守原定的样书将数据填充进去,在绘制的时候,须要用尺子卓越尺寸,为了能够有2个更加好的效益,1般把页面上业已存在不需求再打字与印刷出来的也画出来,可是必要安装属性“printable”为false:表示打字与印刷不出示,若想在预览的时候就无须看到那多少个不要求打字与印刷的,则需安装属性“Visible”为false:表示预览不显得。

美高梅开户网址 55美高梅开户网址 56

三.格式设置

报表中壹些数据须要根据规定的格式去显得,如供给把日子的格式改变一下,选中当前多少,右键单击,点击format(或在属性栏中精选format),在弹出的挑选格式框中甄选须要的格式。若format中并未有索要的格式,则要求在custom中自定义,比如本身要求把时间设置为二零一一-0九-091一:2贰:2叁,此时得以在custom中填时间显示格式:yyyy-MM-ddHH:mm:ss。注意有的要求出示早上可能晚上,表示深夜午后的格式是tt,具体相关安装能够参考已存在的format实行编写制定!如图:

美高梅开户网址 57美高梅开户网址 58

分组记录集

当大家应用投影转换数据时,还是能够分组记录集以及给字段应用聚合函数。根据Category分组全体的出品,然后总结各样门类下产品的个数,还是能总结每一个项目下的平均单价以及各类品种下的仓库储存量总和。如下边包车型大巴代码所示:

var productsGrouped = session.QueryOver<Product>()
                    .Select(Projections.Group<Product>(p => p.Category),
                            Projections.Avg<Product>(p => p.UnitPrice),
                            Projections.Sum<Product>(p => p.UnitsOnStock),
                            Projections.RowCount())
                    .List<object[]>();

为了简单,上面包车型大巴代码中大家从没定义转换,只是让NHibernate重回结果集的行数。

三.格式设置

报表中有个别数据要求服从规定的格式去显得,如必要把时间的格式改变一下,选中当前数量,右键单击,点击format(或在属性栏中接纳format),在弹出的选用格式框中挑选须求的格式。若format中绝非索要的格式,则必要在custom中自定义,比如自个儿急需把时光设置为二零一三-0九-0玖 11:2二:2叁,此时得以在custom中填时间呈现格式:yyyy-MM-dd HH:mm:ss。注意有的要求出示中午要么清晨,表示深夜午后的格式是tt,具体相关安装能够参照已存在的format进行编写制定!如图:

                                               
  美高梅开户网址 59美高梅开户网址 60

              

 1 public class UtilFetchHelper 
 2 {
 3     //获取实体类型
 4     private Type getEntity(string typeName)
 5     {
 6         var workPath = AppDomain.CurrentDomain.BaseDirectory;
 7         string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 8         foreach (string file in files)
 9         {
10             string ext = file.Substring(file.LastIndexOf("."));
11             if (ext != ".dll") continue;
12             try
13             {
14                 Assembly asm = Assembly.LoadFile(file);
15                 Type[] allTypes = asm.GetTypes();
16                 foreach (Type t in allTypes)
17                 {
18                     if (t.IsSubclassOf(typeof(XXDataRecord)))
19                     {
20                         if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
21                             return t;
22                     }
23                 }
24             }
25             catch
26             {
27                 return null;
28             }
29         }
30         return null;
31     }
32 
33     public DataTable BuildDataMemoryPattern(XXParams zb, string id, out int recordCount)
34     {
35         //根据传入参数获取实体名称
36         var entityName = GetDataSourceEntityName(zb);
37         //获取实体类型
38         Type typeEntity = getEntity(entityName);
39         if (typeEntity == null)
40             return  null;
41         var obj = new GenerateDataHelper(_Param);
42         Type myGenericClassType = obj.GetType();
43         MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
44         int count = 0;
45         object[] invokeArgs = new object[] { zb, id, count };
46         var dt = (DataTable)mi.Invoke(obj, invokeArgs);
47         //这里获取回返数据
48         recordCount = (int)invokeArgs[9];
49         return dt;
50     }
51 }
52 
53 public class GenerateDataHelper
54 {
55     private List<XXDataRecord> _DataList;
56     private List<XXDataRecord> DataList
57     {
58         set { _DataList = value; }
59         get { return _DataList; }
60     }    
61     
62     private List<T> GetDataSource<T>() where T : XXDataRecord, new()
63     {
64         var _DataList = new List<T>();
65         var dt = DB.ExecuteDataTable("Select * From XX");
66         for (int i = 0; i < dt.Rows.Count; i++)
67         {
68             var dataEnt = new T();
69             for (int j = 0; j < dt.Columns.Count; j++)
70             {
71                 dataEnt[dt.Columns[j].ColumnName] = dt.Rows[i][j];
72             }
73             _DataList.Add(dataEnt);
74         }
75         return _DataList;        
76      }
77         
78         
79     public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
80     {
81         List<T> DataList = new List<T>();
82         DataList = GetDataSource<T>();
83         //以下是具体实现代码 针对DataList查询操作
84     }
85 }

四.显得设置

对于某些数据,名称较长,在行高固定的场地下,系统暗中同意为自动换行,此时两岸均无法完全展现无法一心体现,比如,此时遵守客户的须求,若供给机关截断,则设置“WordWrap”为false,若必要全数显得,则需求让该数量有依照单元格大小活动缩放功用,设置属性“AutoShrink”为fontsize或许fontwith。

使用QueryOver检索数据

在那个例子中,大家添加壹些成品到数据库,然后使用QueryOver方法检索那些产品。

还要,大家选择Loquacious配置和ConfOrm映射,就当复习后面的剧情了。

ConfOrm映射在NHibernate初学者指南(陆):映射模型到数据库之格局2

Loquacious配置在NHibernate初学者指南(1肆):配置的三种艺术

上面正式最先大家的事例。

  1. 在SSMS中开创一个数据库:QueryOver萨姆ple。

  2. 在Visual Studio中创设二个控制台应用程序:QueryOverSample。

3.
为项目拉长对NHibernate.dll,NHibernate.ByteCode.Castle.dll和ConfOrm.dll程序集的引用。

  1. 在档次中添加三个类公事Category.cs,添加如下代码定义Category实体:

    public class Category
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual string Description { get; set; }
    

    }

  2. 在品种中添加八个类公事Product.cs,添加如下代码定义Product实体:

    public class Product
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual Category Category { get; set; }
     public virtual decimal UnitPrice { get; set; }
     public virtual bool Discontinued { get; set; }
     public virtual int ReorderLevel { get; set; }
     public virtual int UnitsOnStock { get; set; }
    

    }

六.
在Program类中,添加三个静态方法使用Loquacious配置创造1个NHibernate的Configuration对象:

private static Configuration GetConfiguration()
{
    var cfg = new Configuration();
    cfg.SessionFactory()
    .Proxy
    .Through<ProxyFactoryFactory>()
    .Integrate
    .LogSqlInConsole()
    .Using<MsSql2008Dialect>()
    .Connected
    .Through<DriverConnectionProvider>()
    .By<SqlClientDriver>()
    .Using(new SqlConnectionStringBuilder
    {
        DataSource = @".",
        InitialCatalog = "QueryOverSample",
        IntegratedSecurity = true
    });
    return cfg;
}
  1. 在Program类中添加三个静态方法为实体定义映射,代码如下所示:

    private static void AddMappings(Configuration configuration)
    {

     var types = new[] { typeof(Category), typeof(Product) };
     var orm = new ObjectRelationalMapper();
     orm.TablePerClass(types);
     var mapper = new Mapper(orm);
     var hbmMappings = mapper.CompileMappingFor(types);
     configuration.AddDeserializedMapping(hbmMappings, "MyDomain");
    

    美高梅开户网址, }

  2. 在Program类中添加一个静态方法成立或重新创立数据库架构,如下所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

  3. 在Program中拉长别的叁个静态方法创制数量,如上边包车型地铁代码所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

    private static void AddProductsAndCategories(ISessionFactory sessionFactory)
    {

     var categories = new List<Category>();
     var products = new List<Product>();
     var random = new Random((int)DateTime.Now.Ticks);
     for (var i = 1; i <= 5; i++)
     {
         var category = new Category
         {
             Name = string.Format("Category {0}", i)
         };
         categories.Add(category);
         var count = random.Next(10);
         for (var j = 1; j <= count; j++)
         {
             var product = new Product
             {
                 Name = string.Format("Product {0}", i * 10 + j),
                 Category = category,
                 UnitPrice = (decimal)random.NextDouble() * 10m,
                 Discontinued = random.Next(10) > 8,
                 UnitsOnStock = random.Next(100),
                 ReorderLevel = random.Next(20)
             };
             products.Add(product);
         }
     }
     using (var session = sessionFactory.OpenSession())
     using (var tx = session.BeginTransaction())
     {
         foreach (var category in categories)
         {
             session.Save(category);
             foreach (var product in products)
             {
                 session.Save(product);
             }
         }
         tx.Commit();
     }
    

    }

后天大家利用ISession接口的QueryOver方法创造1些数据报表。

10.
创办一个静态方法,创立多少个session和transaction,用来调用报表创建报表方法,如下所示:

private static void PrintReports(ISessionFactory sessionFactory)
{
    Console.WriteLine();
    Console.WriteLine("---------------------");
    Console.WriteLine("| Prining Reports |");
    Console.WriteLine("---------------------");
    using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
        PrintListOfCategories(session);
        tx.Commit();
    }
}
  1. 咱俩必要贯彻PrintListOfCategories方法,代码如下:

    private static void PrintListOfCategories(ISession session)
    {

    Console.WriteLine("\r\nList of categories:\r\n");
    var categories = session.QueryOver<Category>()
    .OrderBy(c => c.Name).Asc
    .List();
    foreach (var category in categories)
    {
        Console.WriteLine("Category: {0}", category.Name);
    }
    

    }

  2. 在Program类中,创制贰个静态字段,如下所示:

    private static ISessionFactory sessionFactory;

一3.
在Main方法中添加如下代码,成立布局,添加映射,制造或另行成立数据库架构,成立session工厂,创立和储存category和product实体,最后调用PrintReports方法,如下所示:

var configuration = GetConfiguration();
AddMappings(configuration);
BuildSchema(configuration);
sessionFactory = configuration.BuildSessionFactory();
AddProductsAndCategories(sessionFactory);
PrintReports(sessionFactory);
Console.Write("\r\n\nHit enter to exit:");
Console.ReadLine();
  1. 运维程序,结果如下图所示:

美高梅开户网址 61

15.
添加另三个表格方法,检索未有下架和内需再行订购的有着成品列表。产品列表应该先按category名称排序,再按product名称排序,代码如下所示:

private static void PrintProductsToReorder(ISession session)
{
    Console.WriteLine("\r\nList of products to reorder:\r\n");
    Product productAlias = null;
    Category categoryAlias = null;
    var products = session.QueryOver<Product>(() => productAlias)
    .JoinAlias(() => productAlias.Category, () => categoryAlias)
    .Where(() => productAlias.Discontinued == false)
    .Where(() => productAlias.ReorderLevel >= productAlias.UnitsOnStock)
    .OrderBy(() => categoryAlias.Name).Asc
    .ThenBy(() => productAlias.Name).Asc
    .List();
    Console.WriteLine();
    foreach (var product in products)
    {
        Console.WriteLine(
        "Category: {0}, Product: {1} (Units on stock: {2})",
        product.Category.Name, product.Name,
        product.UnitsOnStock);
    }
}
  1. 在PrintReports方法中调用PrintProductsToReorder方法。

  2. 重复运维程序,结果如下图所示:

美高梅开户网址 62

在意,由于采用的是随机生成的数字,结果会不等同,作者开头运维了两回,上海体育场面中的矩形框中都并没有结果。

4.显示设置

对此有个别数据,名称较长,在行高固定的情状下,系统默许为自动换行,此时双边均不可能一心呈现不可能完全显示,比如,此时根据客户的要求,若必要机关截断,则设置“WordWrap”为false(即不活动换行),若供给全部展现,则需求让该数量有依据单元格大小活动缩放功效,设置属性“AutoShrink”为fontsize也许fontwith。

View Code

5.边框设置

边框可以通过工具栏设置,此时设置边框是根据外界框的大小来展现,下面框的装置也得以由此设置下划线,此时上边框的长短是依据数量展现的长度来支配,还足以设置属性“underline”为true,此时也是基于边框的深浅来展现的。

总结

先是我们讲解了尺度查询的三种方法,即:非类型化的和强类型的。然后经过三个大概的事例,将理论知识得以利用,在例子中穿插着复习了日前的学识:使用Loquacious配置和ConfOrm映射。

5.边框设置

边框能够经过工具栏设置,此时安装边框是依照外界框的深浅来呈现,上面框的装置也得以由此设置下划线,此时下面框的长短是基于数量突显的长度来支配,还足以安装属性“underline”为true,此时也是依据边框的大大小小来体现的。

 

陆.表格设置

一)表格的队列数:通过质量设置ColumnCount和RowCount设置。

二)合并/分割单元格:选中须求统壹/分割的单元格,右键单击,选用“合并单元格”/“分割单元格”,如图:

美高梅开户网址 63

三)插入行列:选中某行、某列,右键单击,选取须要插入的地点,如图:

美高梅开户网址 64美高梅开户网址 65

6.表格设置

一)表格的连串数:通过质量设置ColumnCount(列)和RowCount(行)设置。

二)合并/分割单元格:选中必要统1/分割的单元格,右键单击,选取“合并单元格”/“分割单元格”,如图:

                                       
       美高梅开户网址 66

 

叁)插入行列:选中某行、某列,右键单击,选用要求插入的职务,如图:

                                 
  美高梅开户网址 67美高梅开户网址 68

 

5.常用代码

伍.常用代码

 

一.在文件编辑器中编辑

法斯特report软件自身带了众多功力完结数量的更换,直接在编辑框中即可兑现。

美高梅开户网址 69

常用的机能有:

美高梅开户网址 70慎选语句IFF;控制语句Switch;

美高梅开户网址 71截取字符串语句SubString,在text列表中挑选SubString

美高梅开户网址 72截取时间语句Date&Time:

美高梅开户网址 73算数运算语句Mathematical:常用的有Abs。

留意,在利用那些function的时候,在文件编辑器右下角会展现当前效果的用法规则,如图:

美高梅开户网址 74美高梅开户网址 75

若当前数据类型不满足规则,则要求利用方面包车型客车更换语句,将其转换到与规则相符的数据类型,才能应用这个function,否则会报错。

1.在文书编辑器中编辑

 

法斯特report软件本人带了累累成效完结数量的转移,直接在编排框中即可完结。

                           
 美高梅开户网址 76

 

常用的作用有:              

                                     
  美高梅开户网址 77选拔语句IFF;控制语句Switch;

                           
 美高梅开户网址 78截取字符串语句SubString,在text列表中选用SubString

                               
 美高梅开户网址 79截取时间语句Date&Time:

     
                                 
 美高梅开户网址 80算数运算语句Mathematical:常用的有Abs(取相对值)。

 

专注,在动用这个function的时候,在文书编辑器右下角会呈现当前功能的用法规则,如图:

 

美高梅开户网址 81美高梅开户网址 82

若当前数据类型不知足规则,则供给使用方面包车型大巴更换语句,将其转换到与规则相符的数据类型,才能应用那么些function,不然会报错。

 

2.在code区编写

些微数据的转移在编辑器中无法一向达成,须要在code区域编写代码。写代码此前供给定义到对应的事件上:选中供给写代码的数额所在的报表拦,在品质设置中式点心击,在事件中双击需求使用的事件,自动跳转到code区,且会油不过生一行代码,类似于privatevoidGroupHeader一_BeforePrint(objectsender,EventArgse)

{

}

报表中常用事件有BeforePrint,AfterPrint。

2.在code区编写

 

稍许数据的转换在编辑器中无法直接促成,须要在code区域编写代码。写代码在此以前需求定义到相应的事件上:选中供给写代码的多少所在的报表拦,在性质设置中点击,在事件中双击要求运用的事件,自动跳转到code区,且会出现壹行代码,类似于private void GroupHeader一_BeforePrint(object sender, EventArgs e)

 

    {

 

    }

 

报表中常用事件有BeforePrint,AfterPrint。

 

三.常用代码

一)Data一.InitDataSource();//数据开始化,用于数据跑一回

二)有的供给把年月日进展分离突显,此时急需选用时间并采用只展现时间的某部分,比如某些DateTime二类型的参数值为二零一二091九,现需求将其年月日分别,分别以__年__月__日突显,需求使用fastreport提供的意义拓展分离,即第11中学的方法,不过注意此种方法只好用于数据类型为datetime的数码;对于非datetime型的数码,能够写代码取位数大概实行强制转换,以string为例:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

stringtbrq=Report.GetColumnValue(“Table1.TBRQ”));

if(!String.IsNullOrEmpty

{

Text9.Text=tbrq.Substring+”年”+tbrq.Substring+”月”+tbrq.Substring+”日”;

}//字符串型用SubString,Substring代表从第0位初始,取出3位作为年。

三)小数位的决定:可以用format对负有数据的小数位举办控制,但只对于数值型的多寡才有效,可是对于string型的则须求用语句进行落实,如:

decimalsl=Report.GetColumnValue(“dtfee.Quantity”);

Cell51.Text=sl.ToString;//”0.00″若不填则依据暗中认可值呈现,前面多少个零展现出来的数据即为有微微个小数;对于数据,有时要求需要有小数时则体现小数,无小数时则显示整数,此时只需求将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

3.常用代码

 

一)Data1.InitDataSource();//数据开始化,用于数据跑四回

 

贰)有的须求把年月日进展分离突显,此时亟需选择时间并采用只显示时间的某有个别,比如某些DateTime二类型的参数值为二零一三091九,现供给将其年月日分别,分别以__年__月__日呈现,要求选用fastreport提供的效果拓展分离,即第11中学的方法,可是注意此种方法只好用于数据类型为datetime的多少;对于非datetime型的多少,能够写代码取位数或许举行强制转换,以string为例:

 

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

 

    {

 

      string  tbrq=  ((String)Report.GetColumnValue(“Table1.TBRQ”));

 

      if (!String.IsNullOrEmpty(tbrq))

 

      {

 

        Text9.Text = tbrq.Substring(0,4) + “年” + tbrq.Substring(4,2) + “月”+tbrq.Substring(6,2)+”日”;

 

      }//字符串型用SubString,Substring(0,四)表示从第0位开端,取出几个人作为年。

 

三)小数位的决定:能够用format对拥有数据的小数位实行支配,但只对于数值型的数目才有效,可是对于string型的则要求用语句举行落到实处,如:

 

decimal sl= ((Decimal)Report.GetColumnValue(“dtfee.Quantity”);

 

Cell5一.Text=sl.ToString(“0.00”);// “0.00”若不填则依照默许值展现,前面多少个零呈现出来的数码即为有多少个小数;对于数据,有时须要要求有小数时则展示小数,无小数时则呈现整数,此时只供给将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

 

奇异意义汇总

特种功效汇总

 

一.打字与印刷中贯彻空表格填满剩余的空行,达到钦定的行数。

1.打字与印刷中贯彻空表格填满剩余的空行,达到钦赐的行数。

 

一.单页展现内定行数

为了能让多少在未填满的前提下,该页也能显得钦定的行数N,供给在数据区添加子报表,且须要设置其质量最少数据行(CompleteToNRows)为N。

美高梅开户网址 83

1.单页展现钦赐行数

 

为了能让数据在未填满的前提下,该页也能显示钦赐的行数N,必要在数据区(data)添加子报表(child),且需求安装其性质最少数据行(CompleteToNRows)为N。

美高梅开户网址 84

 

 

 

 

                             

2.坚守数据行数字展现示钦命行数

遵照一的设置,预览的时候会意识该操作只会决定首页满意条件,当数码的行数当先1页时,前面页均依据有微微多少显示多少行,此时内需写代码控制。

如:

privatevoidPageHeader1_AfterPrint(objectsender,EventArgse)

{if(Engine.FinalPass)

{

Child1.CompleteToNRows=Report.GetVariableValue(“TotalPages”))*20;

}//根据总页数*20来控制CompleteToNRows。

}

那时报表拦中的child区CompleteToNRows设置为壹,如图:

美高梅开户网址 85

二.遵从数据行数字展现示钦定行数

 

依据一的装置,预览的时候会发现该操作只会操纵首页满意条件,当数码的行数超越一页时,前面页均依照有多少数量显示多少行,此时亟待写代码控制。

 

如:

 

private void PageHeader1_AfterPrint(object sender, EventArgs e)

 

{      if (Engine.FinalPass)

 

      {

 

        Child1.CompleteToNRows = ((Int32)Report.GetVariableValue(“TotalPages”)) * 20;

 

      }//遵照总页数*20来控制CompleteToNRows。

 

}

 

此刻报表拦中的child区CompleteToNRows设置为壹,如图:

美高梅开户网址 86

二.本页合计和本期合计

贰.本页合计和本期合计

1.本页合计

在每页均会来得,且总括当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将协商项移到相应的职位即可。如图:

美高梅开户网址 87

一.本页合计

在每页均会显得,且计算当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将合计项移到相应的职位即可。如图:

 

 

 美高梅开户网址 88

二.本期小计

在每页均会来得,可是指在数据的末段1页突显合计的数目,计算当前报表的拥有数据和;须求写total来计量当前值,只是本期小计中打字与印刷后重置这些天性不勾选,由于本期小计只在终极1页显示数据,别的页面上数据区均为空,需求代码控制,例如:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

ifReport.GetVariableValue!=Report.GetVariableValue(“TotalPages”)))//设置彰显本期小计供给的尺度,即当前页与总页数相平等的时候,开首次展览示数据,不然为空。

贰.本期小计

在每页均会来得,可是指在多少的结尾壹页显示合计的数据,总括当前报表的有所数据和;需求写total来测算当前值,只是本期小计中打字与印刷后重置那些本性不勾选,由于本期小计只在最后1页呈现数据,别的页面上数据区均为空,必要代码控制,例如:

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

    {

      if(((Int32)Report.GetVariableValue(“Page”))!=((Int32)Report.GetVariableValue(“TotalPages”)))//设置展现本期小计需求的标准,即当前页与总页数相平等的时候,初步显得数据,不然为空。

3.交叉表的用法

参考模板收取薪金员结账汇总报表.frx

瞩目交叉表的队列宽度不需安装,自动遵照数据长短举办设置。

三.交叉表的用法 (演示)

参照模板    收取费用员结账汇总报表.frx

瞩目交叉表的行列宽度不需安装,自动遵照数据长短进行设置。

4.套打模板

参照模板门诊挂号发票.frx,处方笺.frx

注册发票的沙盘

只顾,在周浦类型中,由于处方笺模板不雷同,在医务职职员和工人作站会根据选拔调用差别的沙盘,此时是将三种分化的模版组合在联合署名,再根据标志调用相应的模板。

四.套打模板(演示)

参照模板   门诊挂号发票(套打).frx,处方笺(综合).frx

注册发票的沙盘

专注,在周浦档次中,由于处方笺模板不均等,在医务卫生职职员和工人作站会依照选用调用不一样的沙盘,此时是将两种分裂的沙盘组合在1齐,再依据标志调用相应的模版。

伍.超链接模板

伍.超链接模板(演示)

报表&单据导入

报表&单据导入

一.单据导入

票据即由开发一贯传入数据源,在模块中落实单据的绘图。

步骤:找到相对应的模块,点击打字与印刷,进入空白模板,再实行设计。对于早已绘制好的模板,可以一向导入,但注意,必须在地点把数据源清空,再导入,不然将相会世data区重复,导致命名出现十分,如data1一。

些微模板尽管清空数据源导入到模板,如故会报错,则需求再行新建3个模板,再将原模板的事物复制进去即可。

相关联的表有:select*fromCommon.ReportTemplate

一. 票据导入

票据即由开发间接传入数据源,在模块中达成单据的绘图。

手续:找到相对应的模块,点击打字与印刷,进入空白模板,再展开规划。对于曾经绘制好的沙盘,能够一向导入,但注意,必须在地面把数据源清空,再导入,不然将会油然则生data区重复,导致命名出现特殊,如data1一。

稍稍模板即便清空数据源导入到模板,还是会报错,则必要再一次新建二个模板,再将原模板的事物复制进去即可。

相关联的表有:select * from Common.ReportTemplate

二.报表导入

报表即由存款和储蓄进程达成,然后再对应到相应的蕴藏进程,去存款和储蓄进程中的数据。

步骤:报表管理à新建报表à填写相应的新闻后保存à绘制模板

留意:填写音讯时要绑定正确的蕴藏进程,同时经过前台改变相应的界面彰显效果。

累加数据源:选拔sql,再采纳相应的存款和储蓄进度,明确即可,对于新建的沙盘,模板①栏不必要选取,若采用了则会调用从前存在的模板,同时更改的话也会潜移默化从前的沙盘。

美高梅开户网址 89美高梅开户网址 90

相关联的表有:

select*fromCommon.Report

select*fromCommon.ReportDataSource

select*fromCommon.ReportTemplate

select*fromCommon.ReportFolder

select*fromCommon.ReportParameter

表明:fastreport本人带有德姆o,里面很多功用都以足以供我们学习参考的。

2.报表导入

报表即由存款和储蓄过程达成,然后再对应到相应的蕴藏进程,去存款和储蓄进程中的数据。

步骤:报表管理à新建报表à填写相应的新闻后保存(演示)à绘制模板

专注:填写音信时要绑定正确的储存进度,同时经过前台改变相应的界面呈现效果。

丰硕数据源:选用sql,再选择相应的存款和储蓄进度,明确即可,对于新建的模版,模板一栏不须求选择,若选取了则会调用此前存在的沙盘,同时更改的话也会影响此前的模版。

美高梅开户网址 91美高梅开户网址 92

相关联的表有:

select * from Common.Report 

select * from Common.ReportDataSource

select * from Common.ReportTemplate

select * from Common.ReportFolder

select * from Common.ReportParameter

 

评释:fastreport自己带有德姆o,里面很多意义都以能够供大家学习参考的。

 

 

 

                              

 

 

 

 

 

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图