NBearLite是NBearV4的几个核心组件之一,也是目前NBearV3中ORM部分的查询语法的核心。NBearLite本身并不是一个完整的ORM解决方案,配合目前Teddy正常开发的NBearMapping组件使用(某个中间组件过渡),组成一套完整强大的ORM解决方案。NBearLite的目标是提供一种SQL语句和存储过程透明的方便快捷,面向对象化的数据库操作,专门负责SQL语句生成,数据库连接管理,事务管理,参数管理,提供各种查询接口。 下载地址:http://sourceforge.net/projects/nbear/files/
本教程演示使用Visual Studio 2005创建一个Web程序,使用NBearLite查询SQL Server 2000自带的Northwind数据库的典型过程。对于WinForm程序开发者而言,同样具有参考价值,只需注意在WinForm程序中应用程序配置文件为App.config,而Web程序中为Web.config。
步骤1 新建Website工程
在VS2005中新建一个Website,为Website新建一个App_Code目录。
在 Default.aspx文件中新建一个名叫GridView1的GridView控件和一个名叫GridView2的GridView控件。
步骤2 配置ConnectionString
修改Web.config文件,在<configuration>中添加一个下面的<connectionStrings>配置节(如果您使用的是其他数据库,请参考配置ConnectionString),请注意修改其中访问您本地SQL Server数据库的帐号密码。
<connectionStrings>
<add name="Northwind" connectionString="Server=(local);Database=Northwind;Uid=sa;Pwd=sa" />
</connectionStrings>
步骤3 引用NBearLite.dll
为Website项目添加NBearLite.dll引用(位于下载的zip包的dist目录),如果您使用的是其他数据库类型,您可能需要引用额外的dll,请访问NBearLite支持的数据库。
步骤4 使用QueryColumnGenerator.exe工具生成强类型查询辅助类和存储过程访问包装类
运行QueryColumnsGenerator.exe工具
在该工具的主界面上的Connection String文本框内输入Server=(local);Database=Northwind;Uid=sa;Pwd=sa (请注意修改其中访问您本地SQL Server数据库的帐号密码),在Root Class Name文本框内输入Northwind。
点击Connect按钮,左边的列表会显示所有的表和视图。
点击左上角的CheckBox,选中所有的表和视图。
选择输出语言为C#。
点击Generate Code按钮,您将看到output文本区域显示了生成的C#代码。
点击Save Output As按钮,将生成的代码保存到你的Website工程的App_Code目录中,文件名为Northwind.cs。
步骤5 检查生成的代码
在Website工程中,刷新项目文件,您将看到App_Code目录中的 Northwind.cs文件。
编译Website,如果编译成功,没有任何错误或警告,则代表生成的代码和之前对NBearLite.dll的引用都正确。
步骤6 实例化Database对象实例
打开Default.aspx.cs文件,在文件顶部添加两个using如下:
using NBearLite; //这个是NBearLite的命名空间
using QueryColumns; //这是生成的查询辅助类的命名空间,如果您希望使用别的命名空间,可以在步骤4的工具界面修改Output Namespace文本框的内容,指定您要的命名空间。
在Page_Load事件方法处理中添加如下代码,实例化Database对象:
Database db = new Database("Northwind");
步骤7 使用Database类进行查询
在Page_Load事件处理方法中继续添加如下代码
GridView1.DataSource = db.Select(Northwind.Categories).ToDataSet().Tables[0]; //读取所有的Categories
int ret = -1;
string outStr = "1";
GridView2.DataSource = Northwind.SalesByCategoryTest(db, out ret, "test1", "1997", ref outStr); //调用存储过程
结束
至此,您应该已经学会了使用NBearLite进行数据库查询的基本过程。
篇后语
这只是一个演示,所以,所有的岩石代码都放在 Default.aspx.cs文件里了。实际的开发过程中,我们应避免频繁实例化Database对象。一般,我们可以在App_Code目录中定义一个Class,该类中定义static的Database实例属性,再通过这个static实例来进行查询。这样在所有页面和Website的代码文件中都可以共享这个实例。
如果您希望查看或记录运行时NBearLite的强类型语法背后生成的实际的SQL内容,请访问查看运行时的SQL日志。
如果您想访问的是Oracle数据库,请注意NBearLite对Oracle数据表的字增长字段的支持有一些特别的约定,请访问关于Oracle返回最近插入的自增长字段值。
恭喜您完成本教程!
---------------------------------------------
在NBearV3中希望从一个表中根据条件查询出数据对象,可以使用如下对象查询语法:
&& ! (Product._.Discontinued == true )) || Product._.UnitPrice < 10m).ToArray < Product > ;
这里,从对象逻辑语法到SQL语句的生成,再到结果集映射,NBearV3的Gateway对象一手包办。
在NBearLite中,继承保留了NBearV3的对象查询语法,专职负责查询。而且只保留了ToDataReader,ToDataSet,ToScalar等返回ADO.NET原生数据对象的接口,与实体没有直接的联系。如下代码取自,NBearLite DatabaseTest:
Where(Northwind.Categories.CategoryID > 0).ToDataSet();
在NBearLite中,数据接口由Gateway变成了Database,所有的数据库操作都是通过Database所提供的接口来完成。在NBearLite也不需要定义和创建与数据库字段相关的实体类(不需要映射),那么如何实现对象化的数据库操作呢?在NBearLite中,提供了一个中NBearLite.QueryColumnsGenerator的代码生成工具,故名思意,就是用于生成查询字段描述代码的工具。该工具可以生成整个数据库,包括包,视图的字段描述定义,存储过程的函数式调用的包装代码。
字段描述定义,可以参看NBearV3中,实体类的@__Columns内联类的定义,实际工具生成的就是这段代码。存储过程的包装代码确实有点创意,如下:
{
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;
}
现在,参照NBearLite的Test用例,简单介绍一下NBearLite该如何使用。首先要创建一个Database对象,Database db = new Database("Northwind");该构造函数可接受多种重载,这种是最常用的重载方式,”Northwind”是在application config 中定义好的一个数据库连接串名称。
该配置节的providerName属性名可以用于指定使用哪种NBearLite Db Provider,如下配置节就表示,客户系统希望使用postgresql数据库:
Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;" providerName ="postgresql" />
Database对象生成后,就所有的数据库操作都是通过它来完成的,其中Northwind类就是由NBearLite.QueryColumnsGenerator生成的数据库描述类:
1. 往数据库插入一条只有一个CategoryName字段值的记录
2. 根据条件更新字段值
Where(Northwind.Categories.CategoryName == " test1 " ).Execute()
3. 根据条件删除记录
4. 查询记录
a) 简单查询
//查询Northwind数据库的Categories表中的所有记录。
Where(Northwind.Categories.CategoryID > 0 ).ToDataSet();
//查询返回Categories中CategoryID大于0的CategoryName列记录。
b) 复杂查询
GroupBy(Northwind.Categories.CategoryName).OrderBy(Northwind.Categories.CategoryName.Desc).
SetSelectRange(2, 2, Northwind.Categories.CategoryName).ToDataSet()
//根据CategoryName分组,排序,并返回从第3行开始的前两条数据。
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中,所有的日志记录方式都是一样的,也很简单。如下定义一个相同原型的函数(静态函数):
{
}
函数名可以不一样,参sql就是生成的SQL语句,在该函数中,我们可以决定是将该参数保存到文件中,还是显示出来。
接下来将该函数赋值给db.OnLog属性成员
db.OnLog += OnLog;
+= 是委托代理的使用方式。就这样,就可以实现SQL语句的跟踪了。如果对委托代理还不理解的朋友,建议可以去了解一下相关的知识。
这样我们调用该存储过程就可以直接使用函数传参和获得返回值,完全可以避免烦杂的ADO.NET对象操作,便于调用和维护。对数据库中的每个存储过程,NBearLite都会生成一个与之对应的调用函数。