`
javatoyou
  • 浏览: 1015266 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

NBearLite使用入门

 
阅读更多

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

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1Product[]products=gateway.From<Product>().Where((Product._.UnitsInStock<=Product._.ReorderLevel
&&!(Product._.Discontinued==true))||Product._.UnitPrice<10m).ToArray<Product>;

1Product[]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:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->ds=db.Select(Northwind.Categories,Northwind.Categories.CategoryName).
Where(Northwind.Categories.CategoryID>0).ToDataSet();

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

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->publicstaticSystem.Data.DataSetCustOrderHist(NBearLite.Databasedb,outintRETURN_VALUE,stringCustomerID)
{
if((db==null))
{
thrownewSystem.ArgumentNullException("db","Parameter:dbcouldnotbenull!");
}
NBearLite.StoredProcedureSectionspSection
=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.DataSetds
=spSection.ToDataSet(outoutValues);
RETURN_VALUE
=((int)(outValues["RETURN_VALUE"]));
returnds;
}

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

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><addname="Northwind"connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa"/>

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><addname="Postgres"connectionString="UserID=postgres;Password=sasa;Host=localhost;Port=5432;Database=postgres;
Pooling=true;MinPoolSize=0;MaxPoolSize=100;ConnectionLifetime=0;"
providerName="postgresql"/>

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

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName,"test1").Execute()

2. 根据条件更新字段值

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->db.Update(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName,"test1").
Where(Northwind.Categories.CategoryName
=="test1").Execute()
3. 根据条件删除记录
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->db.Delete(Northwind.Categories).Where(Northwind.Categories.CategoryName=="test111").Execute()

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->DataSetds=db.Select(Northwind.Categories).ToDataSet();

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

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->ds=db.Select(Northwind.Categories,Northwind.Categories.CategoryName).
Where(Northwind.Categories.CategoryID
>0).ToDataSet();

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

b) 复杂查询

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->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行开始的前两条数据。

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->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中,所有的日志记录方式都是一样的,也很简单。如下定义一个相同原型的函数(静态函数):

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->publicstaticvoidOnLog(stringsql)
{
}

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

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

db.OnLog += OnLog;

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

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

完。

在上一篇NBearLite使用入门中,简单了介绍了一下NBearLite基本情况。代码也是直接摘抄teddy在NBearLite源码中的测试代码,自己也没有动手去写过示例代码,也从来都没有真正使用过NBearLite的经历,所以心里难免会没底。今天晚上终于把示例代码补上了。在示例中,还包括了1.0.0.6的最新支持Save DataTable/DataRow的示例代码以及批量插入和指量指定DbCommand的例子。

应该算是昨天晚上了,teddy发布的1.0.0.6版本中,在Database里新增加了8种Save方法。都是针对 DataTable/DataRow的新增行和更改行后,能够直接调用这些接口更新到数据库。提供了这些接口后,会给很多直接使用DataTable作为 数据载体的朋友带来非常大的方便,先来看看它们是如何使用的:

SelectSqlSection sqlSection = db.Select(Northwind.Categories).Where(Northwind.Categories.CategoryID == categoryID);
DataTable dataTable = sqlSection.ToDataSet().Tables[0];
dataTable.Rows[0]["CategoryName"] = "modified";
DataRow newRow = dataTable.NewRow();
newRow["CategoryName"] = "newCategory";
dataTable.Rows.Add(newRow);
int affectRows = db.Save(sqlSection.ToDbCommand(), newRow, dataTable.Rows[0]);

在这段代码里,做了更新一条数据,和插入一条新数据的工作。使用就是这么方便,那它是如何实现的呢?其实,NBearLite只是做了非常少了事 情,NBearLite是通过DbCommandBuilder来实现DataTable/DataRows的成批数据更改提交的。在ADO.NET提供 的DataRow对象中,有一个属性是用来标识数据行的状态(RowState)。DbCommandBuilder就是利用这个行状态来生成插入的 DbCommand,还是更新DBCommand,甚至是删除的DBCommand,进而利用DataAdapeter来执行这些生成的 DBCommand,达到自动提交和更新数据的目的。

原理就是这样,使用这个接口还需注意,传入的DataRow参数,必须是已经被加入到创建它的DataTable(也就是调用 dataTable.Rows.Add(newRow); ),如果一个数据行只被NewRow()出来,而没有被加到DataTable中,这时的行状态并不是Added,而是游离状态(Detached)也就 无法被提交插入到数据库了。

上面提到的,DbCommandBuilder是可以生成DeleteCommand的,都就意味着,使用Database的Save接口也是可以 实现数据行删除的,要将DataTable中的某一行删除,必须调用DataRow的Delete方法,而不是调用DataTable.Rows的 Remove方法,这个方法纯粹就是集合删除项的意义了。

在例子中,还提供了成批插入数据和成批执行DbCommand的代码。成批插入数据有两种重载方法,带事务和不带事务。

public int ExecuteBatchInsert(string tableName, string[] columnNames, DbType[] columnTypes, object[][] rows,  int batchSize, DbTransaction tran)
public int ExecuteBatchInsert(string tableName, string[] columnNames, DbType[] columnTypes, object[][] rows, int batchSize)

前几个参数都不难理解,就rows这个参数会比较麻烦,它是一个二维数据。外维表示记录的数据,内维表示的是每个字段的值。估计很多人跟我一样,平 常不怎么操作二维数组,(维护的关系),所以我个人认为这个接口的友好性方面还有待提高。并且这个接口的运行结果与目标值有一定差距,可能目前还存一些 BUG。

另一种批处理是成批执行DBCommand,最大的目的就是为了能减少与数据库的连接次数(就跟团购一样,大家都是为了省钱)。大家都知道,数据库 操作其实最费时间的是打开和关闭数据库连接,尽管在ADO.NET中,已经提供了连接池来解决这个问题,但是数据库连接毕竟是有限的。如果能让一些具有相 同行为的DBCommand只用一次连接,那无疑可以大大提高程序的性能。NBearLite的成批执行DBCommand功能就是为了能过简单的接口来 支持这一种行为。要使用Batch Command,首先要调用:

db.BeginBatchConnection(3);

参数指定了多少个Command执行一次。

接下来的就跟执行普通的DBCommand没什么两样:

db.ExecuteNonQuery(db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "comand" + i.ToString()).ToDbCommand());

成批执行完后要调用db.EndBatchConnection();来结束这一次的团购。

从接口的实现上,只要我们打开了批处理的选项后。不管是有没有返回的执行接口 ExecuteDataSet/ExecuteScalar/ExecuteNonQuery/ExecuteReader 都会一视同仁,成批处理。从现实的角度来看,除了插入记录外,有返回数据的,我们一般都会要求马上返回数据库,而此时如果成批了,就不会马上返回数据了。 并且就算有返回了,你也不知道用什么,在哪里去接收。因此除了ExecuteNonQuery有批处理的必要外,其它的接口不应该这样去做。

分享到:
评论

相关推荐

    nbearlite

    &lt;br&gt;推荐在使用NBearLite的同时结合使用NBearMapping进行IDataReader/DataRow数据类型和自定义.NET类 (如:实体类或业务类)之间的填充转换,以及任意自定义.NET类和自定义.NET类之间的数据映射转换(如异构系统...

    NBearLite .net 开发框架

    NBearLite本身并不是一个完整的ORM解决方案,配合目前Teddy正常开发的NBearMapping组件使用(某个中间组件过渡),组成一套完整强大的ORM解决方案。NBearLite的目标是提供一种SQL语句和存储过程透明的方便快捷,面向...

    NBearLite_PetShop

    NBear架构的petshop

    NBearLite对数据访问层的封装工具

    NBearLite对数据访问层的封装工具 ,方便好用。

    NBearLite v1.0.1.5

    NBearLite本身并不是一个完整的ORM解决方案,配合目前Teddy正常开发的NBearMapping组件使用(某个中间组件过渡),组成一套完整强大的ORM解决方案。NBearLite的目标是提供一种SQL语句和存储过程透明的方便快捷,面向...

    NBearLite 1.025 完美 生成工具

    NBear自身的生成带的工具界面和使用很不好,本人在此基础上,对NBearLite QueryColumns Genaretor进行了修改,包括汉化,使用起来会很方便, 使用的时候需要放在NBearLite_v1.0.2.5_bin\dist下面使用,因为数据库的...

    NBearLite PetShop 4.0

    微软的PetShop是一个学习.NET三层架构的很好例子,其中应用和微软的很多技术,例如MemberShip等,本例子是采用经典的ORM架构NBearLite开发的PetShop,主要是重写了DA层,有助于大家学习PetShop和NbearLite

    NBearLite_v1.0.2.5 (附加强版生成工具)

    NBearLite_v1.0.2.5! 可惜已经不在更新。

    NBEARLISY使用

    NBearLite Version 1.0.0.9 beta ------------------------------- Author: Teddy (shijie.ma@gmail.com) Official Site: http://nbear.org Open Source License: BSD Copyright: 2007-2010 Release Notes ---...

    使用NSun(框架)快速开发项目

    NSun简介:NSun基于.Net2.0快速开发框架设计,使用NbearLite作为基础进行二次封装,加入对实体的操作。发布网站:http://www.cnblogs.com/duanseven(对于NSun的更新以及教程)核心DLL:NSun.Core.dllNBearLite....

Global site tag (gtag.js) - Google Analytics