设为首页 收藏本站
查看: 958|回复: 0

[经验分享] NBearLite使用入门

[复制链接]

尚未签到

发表于 2016-11-22 08:50:06 | 显示全部楼层 |阅读模式
  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入门二

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303766-1-1.html 上篇帖子: Advacned Puppet: Puppet Master性能调优 下篇帖子: 【翻译】编写第一个Django app,第二部分——创建模型和使用模型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表