NBearLite是NBearV4的几个核心组件之一,也是目前NBearV3中ORM部分的查询语法的核心。NBearLite本身并不是一个完整的ORM解决方案,配合目前Teddy正常开发的NBearMapping组件使用(某个中间组件过渡),组成一套完整强大的ORM解决方案。NBearLite的目标是提供一种SQL语句和存储过程透明的方便快捷,面向对象化的数据库操作,专门负责SQL语句生成,数据库连接管理,事务管理,参数管理,提供各种查询接口。

在NBearV3中希望从一个表中根据条件查询出数据对象,可以使用如下对象查询语法:

1 Product[] products = gateway.From<Product>().Where((Product._.UnitsInStock <= Product._.ReorderLevel
&& !(Product._.Discontinued == true)) || Product._.UnitPrice < 10m).ToArray<Product>;

1 Product[] products = gateway.From<Product>().Where((Product._.UnitsInStock <= Product._.ReorderLevel && !(Product._.Discontinued == true)) || Product._.UnitPrice < 10m).ToArray<Product>;

这里,从对象逻辑语法到SQL语句的生成,再到结果集映射,NBearV3的Gateway对象一手包办。

ds = db.Select(Northwind.Categories, Northwind.Categories.CategoryName).Where(Northwind.Categories.CategoryID > 0).ToDataSet();

在NBearLite中,继承保留了NBearV3的对象查询语法,专职负责查询。而且只保留了ToDataReader,ToDataSet,ToScalar等返回ADO.NET原生数据对象的接口,与实体没有直接的联系。如下代码取自,NBearLite DatabaseTest:

ds = db.Select(Northwind.Categories, Northwind.Categories.CategoryName).
Where(Northwind.Categories.CategoryID > 0).ToDataSet(); 

在NBearLite中,数据接口由Gateway变成了Database,所有的数据库操作都是通过Database所提供的接口来完成。在NBearLite也不需要定义和创建与数据库字段相关的实体类(不需要映射),那么如何实现对象化的数据库操作呢?在NBearLite中,提供了一个中NBearLite.QueryColumnsGenerator的代码生成工具,故名思意,就是用于生成查询字段描述代码的工具。该工具可以生成整个数据库,包括包,视图的字段描述定义,存储过程的函数式调用的包装代码。

字段描述定义,可以参看NBearV3中,实体类的@__Columns内联类的定义,实际工具生成的就是这段代码。存储过程的包装代码确实有点创意,如下:

public static System.Data.DataSet CustOrderHist(NBearLite.Database db, out int RETURN_VALUE, string CustomerID)
    {
        if ((db == null))
        {
            throw new System.ArgumentNullException("db", "Parameter: db could not be null!");
        }
        NBearLite.StoredProcedureSection spSection = db.StoredProcedure("CustOrderHist");
        System.Collections.Generic.Dictionary<string, object> outValues;
        spSection.SetReturnParameter("RETURN_VALUE", System.Data.DbType.Int32, 0);
        spSection.AddInputParameter("CustomerID", System.Data.DbType.StringFixedLength, CustomerID);
        System.Data.DataSet ds = spSection.ToDataSet(out outValues);
        RETURN_VALUE = ((int)(outValues["RETURN_VALUE"]));
        return ds;
    }

这样我们调用该存储过程就可以直接使用函数传参和获得返回值,完全可以避免烦杂的ADO.NET对象操作,便于调用和维护。对数据库中的每个存储过程,NBearLite都会生成一个与之对应的调用函数。

现在,参照NBearLite的Test用例,简单介绍一下NBearLite该如何使用。首先要创建一个Database对象,Database db = new Database("Northwind");该构造函数可接受多种重载,这种是最常用的重载方式,”Northwind”是在application config 中定义好的一个数据库连接串名称。

<add name="Northwind" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa" />

该配置节的providerName属性名可以用于指定使用哪种NBearLite Db Provider,如下配置节就表示,客户系统希望使用postgresql数据库:

<add name="Postgres" connectionString="User ID=postgres;Password=sasa;Host=localhost;Port=5432;Database=postgres;
Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;" providerName="postgresql" />

Database对象生成后,就所有的数据库操作都是通过它来完成的,其中Northwind类就是由NBearLite.QueryColumnsGenerator生成的数据库描述类:

1. 往数据库插入一条只有一个CategoryName字段值的记录

db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").Execute()

2. 根据条件更新字段值

db.Update(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").
Where(Northwind.Categories.CategoryName == "test1").Execute()

3. 根据条件删除记录

db.Delete(Northwind.Categories).Where(Northwind.Categories.CategoryName == "test111").Execute()

4. 查询记录
a) 简单查询

DataSet ds = db.Select(Northwind.Categories).ToDataSet();

//查询Northwind数据库的Categories表中的所有记录。

ds = db.Select(Northwind.Categories, Northwind.Categories.CategoryName).
Where(Northwind.Categories.CategoryID > 0).ToDataSet();

//查询返回Categories中CategoryID大于0的CategoryName列记录。

b) 复杂查询

db.Select(Northwind.Categories, Northwind.Categories.CategoryName).
GroupBy(Northwind.Categories.CategoryName).OrderBy(Northwind.Categories.CategoryName.Desc).
SetSelectRange(2, 2, Northwind.Categories.CategoryName).ToDataSet()

//根据CategoryName分组,排序,并返回从第3行开始的前两条数据。

db.Select(Northwind.Categories, Northwind.Categories.__Alias("CategoriesAlias").CategoryName).
Join(Northwind.Categories, "CategoriesAlias", Northwind.Categories.CategoryID ==
Northwind.Categories.__Alias("CategoriesAlias").CategoryID).

SetSelectRange(2, 2, Northwind.Categories.CategoryID).Where(Northwind.Categories.CategoryName.Length > 0 &&
Northwind.Categories.__Alias("CategoriesAlias").Description != null).

ToDataSet();

//上面的语句演示了如何进行表之间的关联查询

5. 调用存储过程

Northwind.SalesbyYear(db, out ret, new DateTime(1800, 9, 9), DateTime.Now);

NBearLite本身并不需要任何的外部配置的支持,对象化的查询语法会自动生成SQL语句的同时,也提供了多种数据库透明的可能。目前NBearLite中已实现的Db Provider包括:SqlServer(2000/2005),Oracle,MsAccess,MySql,PostgreSql,Sqlite。大部分都是我没有使用过的。L

最后一点,关于生成的SQL语句保存起来便于跟踪的问题。那天在MSN群里有一位朋友在问如何使用Log委托的问题,到最后愣是没让他明白。在NBear中,所有的日志记录方式都是一样的,也很简单。如下定义一个相同原型的函数(静态函数):

 public static void OnLog(string sql)
    {
    } 

函数名可以不一样,参sql就是生成的SQL语句,在该函数中,我们可以决定是将该参数保存到文件中,还是显示出来。

接下来将该函数赋值给db.OnLog属性成员

db.OnLog += OnLog;

+= 是委托代理的使用方式。就这样,就可以实现SQL语句的跟踪了。如果对委托代理还不理解的朋友,建议可以去了解一下相关的知识。

文中提到的相关代码和使用示例,可以到NBearLite的Test工程中得到。NBearLite的源码可以从这里下载.

完。

原文作者:阿不

相关文章:

NBearLite入门二

NBearLite使用入门相关推荐

  1. 味道不错的NBearLite查询语法

    最近在博客园博客程序的开发中使用了NBearLite进行数据库访问操作,然后通过NBearMapping将查询的结果映射到实体类.     NBearLite的查询语法设计得很体贴,用起来很舒服,正是 ...

  2. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  3. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  4. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  5. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  6. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

  7. SpringBoot (一) :入门篇 Hello World

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  8. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  9. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

最新文章

  1. iOS黑科技之(CoreImage)静态人脸识别(一)
  2. python延时函数_Python实现屏幕自动截图
  3. 域控 正在应用计算机设置,域控制器下发的用户组策略在ou内的用户上没有应用...
  4. 幻灯片形式设计:从方法到技巧
  5. linux soc 程序崩溃,SOC、FLCK和内存之间的关系,以3900X+X570为例(更新PCIE4.0)
  6. oracle下拉菜单多选,多选下拉控件的使用(select-option)multiple-select
  7. 计算机一级在上网题中如何新建文本文件?
  8. ue编辑器漏洞_UEditor编辑器任意文件上传漏洞分析
  9. iconfont添加新图标_IconFont图标引用的方法步骤(代码)
  10. JZOJ3987. Tree
  11. 经典算法:鸡蛋掉落问题
  12. Java前叉夹器_大器晚成 SRAM S-900直装夹器评测
  13. requires_grad,grad_fn,grad的含义及使用
  14. 你不可不知的Java引用类型之——SoftReference源码详解
  15. K8s关于异常Pod的处理
  16. 通过百度语音生成音频文件
  17. css自适应单位布局vm,vh
  18. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
  19. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用
  20. 【VPR】 Graphics - vpr的图形界面

热门文章

  1. 软件建模与分析——G003-185-03
  2. python3多进程_多进程 · 廖雪峰的Python3.x教程 · 看云
  3. 用LCD1602制作可调电子钟
  4. 皇马,这回欧冠冠军还是你吗?
  5. coderwhy--前端知识整合包--htmlcss08
  6. python 表情包制作库_Django+PIL 做一个表情包生成网站
  7. php获取 url 井号,php获取url井号后的参数(描点#后参数)
  8. HTML最新面试题(笔试面试题)
  9. npm install 出错read ECONNRESET
  10. 新神魔大陆服务器维护,《新神魔大陆》8月20日合服维护公告