(PDF.NET框架实例讲解)将任意复杂的SQL查询映射

2019-11-26 15:01 来源:未知

通常情况下我们的ORM框架都是将单表或者视图映射成一个实体类,有时候也会将存储过程映射成实体类,如果处于系统移植性的考虑,你不想写存储过程,那这些复杂的SQL查询怎么映射成实体类?

PDF.NET数据开发框架可以将表,视图,表值函数,自定义的查询语句和存储过程映射为实体类,在上一篇《(PDF.NET框架实例讲解)将任意复杂的SQL查询映射成实体类 》已经讲解了自定义查询的实体类映射方法,今天来讲讲存储过程的映射操作。

实际上,不管是单表,视图,存储过程,SQLSERVER的表值函数,自定义的SQL查询,甚至是任意复杂的SQL查询,都可以用一个SQL语句来表示,只要我们的ORM框架能够实现将SQL语句的查询结果映射成实体类,那么使用ORM就很简单了。我们使用PDF.NET(PWMIS数据开发框架)来实例讲解一下这个过程。

 

 

1,使用代码工具,生成实体类代码

1,首先下载并安装一个“PDF.NET集成开发环境”,详细内容请参见《PDF.NET数据开发框架之集成开发工具Ver 4.1发布》,下面是该工具运行的界面:

具体过程跟“上一篇”文章中的步骤1-4一样,请参见原文。

图片 1

图片 2 

2,在“数据连接”选项卡上,选择或创建一个连接分组,然后再添加一个连接(注意鼠标右键菜单),之后就能够打开该连接,看到该连接下面的数据库、表、视图、存储过程等内容,如上图所示。工具支持各种类型的数据库。

 

 

注意为了获得存储过程的表架构,需要在下图的窗口中输入类似的代码:

3,新建一个查询,在上图右边的内容区输入你的SQL语句,按“F5”键,如果正确将会看到结果网格。

exec 存储过程名称 参数值1,参数值2

    到此为止,你可以使用本工具作为一个支持多种数据库的“查询分析器”来使用了,你还可以扩展它的数据提供程序,以支持你自己的数据源。

 

4,在“查询窗口”,鼠标右键的弹出菜单上,选择“生成实体类”

这里我们输入

图片 3

 

 

exec GetExcellentDetails 'A',3

 然后,弹出一个新窗口,进行生成实体类的有关设置:

 

图片 4

查询名称和实体类名称都输入为“InvestmentSolutionData”,在我们的Model项目下面将会生成一个文件 InvestmentSolutionData.cs

注意勾选“SQL查询的有效性”,并输入要映射的实体类名称等信息,然后点击“确定”。

 

 

2,修改刚才生成的实体类文件,设置“映射为存储过程”:

图片 5

 

在“属性浏览器”里面,进行一些生成的设置,主要有文件路径和代码语言的选择,设置好以后,可以单击网格上面的“预览”连接,弹出如下界面:

  public partial class InvestmentSolutionData : EntityBase
  {
    public InvestmentSolutionData()
    {
            TableName = "WStModel.Entitys.InvestmentSolutionData";
            EntityMap=EntityMapType.StoredProcedure;
            //IdentityName = "标识字段名";

 

            //PrimaryKeys.Add("主键字段名");
         
    }
//其它属性略
}

图片 6

 

这个时候可以看到我们生成的实体类的原貌,如果觉得不好,可以修改重新进行。

也就是这一句:EntityMap=EntityMapType.StoredProcedure

关闭窗口后,如果还想添加更多的自定义查询,请单击“高级”按钮,将重复上面的步骤,添加一个新的查询,结果如下图:

 

 

3,修改刚才生成的实体查询配置文件 EntitySqlMap.config

图片 7

修改前:

单击“生成”按钮,将生成两个选中的实体类文件。

 

注意:这里除了生成的实体类文件之外,还会生成一个固定名称的实体类配置文件 EntitySqlMap.config文件,下面将会讲到它的用处。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <Namespace name="DemoNameSpace">
    <Map name="DemoSqlName">
      <Sql><![CDATA[ select * from table ]]></Sql>
    </Map>
  </Namespace>
  <Namespace name="WStModel.Entitys">
    <Map name="InvestmentSolutionData">
      <Sql>
        <![CDATA[
     exec GetExcellentDetails 'A',3
     ]]></Sql>
    </Map>
  </Namespace>
</configuration>

 

 

5,经过上面的步骤,我们的实体类文件生成好了,下面做一些准备工作,看看如何在项目里面使用。

 修改后:

    先打开自定义查询的实体类配置文件 EntitySqlMap.config文件,我们做一下修改:

 

图片 8

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <Namespace name="DemoNameSpace">
    <Map name="DemoSqlName">
      <Sql><![CDATA[ select * from table ]]></Sql>
    </Map>
  </Namespace>
  <Namespace name="WStModel.Entitys">
    <Map name="InvestmentSolutionData">
      <Sql>
        <![CDATA[
      GetExcellentDetails 
      #solution:String,String,2#,
      #yield:Int32#
]]></Sql>
    </Map>
  </Namespace>
</configuration>

修改该文件的内容,将原来有实际基金代码的地方,都替换成 @jjdm 的SQL查询参数名称,如上图。

因为存储过程 GetExcellentDetails  有两个参数,所以需要在这里显式的指明,参数solution 是varchar(2)类型,参数yield 是int 类型,按照SQL-MAP的语法规则(参见《PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范 》),改写成上面的样子。(注:之所以要用该语法,是为了屏蔽具体数据库的差异) 

接下来,将这3个文件添加到我们的Model项目中:

 

 

4,编写代码,使用“存储过程”实体类

图片 9

使用“存储过程”实体类跟使用其它类型的实体类比较类似,但存储过程可能有参数,所以需要初始化参数值,实例代码如下所示:

 

 

接下来,将EntitySqlMap.config文件作为嵌入式资源文件编译,注意如果你做的是WinForm 程序,可以跳过这一步,但程序运行时需要包含该文件,所以还是建议作为嵌入式文件编译,这样有更好的安全性。另外该文件应该和实体类文件放到同一个目录下面。

        public IEnumerable<IInvestmentSolutionData> GetSolutionData(string solutionName,int period)
        {
            //InvestmentSolutionData 为存储过程实体类
            InvestmentSolutionData entity = new InvestmentSolutionData();
            OQL q = new OQL(entity);
            q.InitParameters = new Dictionary<string, object>();
            q.InitParameters.Add("solution", solutionName);
            q.InitParameters.Add("yield", period);
            //执行查询
            q.Select();
            List<InvestmentSolutionData> list = EntityQuery<InvestmentSolutionData>.QueryList(q);
            return list;
        }

图片 10

上面的例子中,调用了OQL对象的InitParameters 属性,初始化实体类查询需要的值。

 

 

最后,我们看看如何在项目里面使用这样的实体类:

目前,PDF.NET的代码生成器还不能自动生成以上代码,如果要“享受自动生成代码”的过程,则需要使用框架的“SQL-MAP”技术,参见《抽象SQL(参数化)查询 》一文。不过使用本文介绍的“存储过程”实体类映射技术,在使用方式上更灵活,至少你不用单独去生成一个DAL层了。

图片 11

 

自定义查询的实体类跟普通的PDF.NET实体类使用方式类似,都需要OQL表达式来操作,例如选取要使用的字段,设置Where条件,这里为了简便,仅仅调用了OQL.Select()方法,选取查询出来的全部列。

注:本文所说的功能需要在PDF.NET 4.1以上支持,PDF.NET本身仅需要.net 2.0支持,框架的最新版本没有公开发布,但已经有不少用户正在项目里面使用,有关框架的详细信息请看官网介绍:

注意:自定义查询的实体类如果你的SQL查询语句需要使用参数,例如本地的 @jjdm,则还应该设置OQL的InitParameters属性,如上图所示。

 

最后,将可以直接查询了,用过PDF.NET框架的朋友都知道,就一行代码,如本例所示:

 

 

 

  List<JJDangAnInfo> list = EntityQuery<JJDangAnInfo>.QueryList(q);

 

 

6,经过以上步骤,我们的代码已经可以运行了。当前的实例用到了一个ASP.NET+MVC 2.0的项目中,下面是运行的效果图:

图片 12

PDF.NET自定义查询实体类的实例运用,还可以参考

SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。

 

除了可以通过本文说的方式将SQL语句映射到实体类,还可以通过PDF.NET内置的SQL-MAP技术来实现实体类映射,就像iBaits那样,但比iBaits简单很多,详细内容,请参看:

 

PDF.NET数据开发框架 之SQL-MAP使用存储过程

 

 

注:本文所说的自定义查询在PDF.NET3.5以后方可以支持,实例代码需要在PDF.NET 4.1以上支持,PDF.NET本身仅需要.net 2.0支持,框架的最新版本没有公开发布,有关框架的详细信息请看官网介绍:

 

 

 

TAG标签:
版权声明:本文由32450新蒲京网站发布于葡萄游戏厅_体育游戏,转载请注明出处:(PDF.NET框架实例讲解)将任意复杂的SQL查询映射