Teddy's Knowledge Base

发布NBearLite v1.0.0: 提供强类型查询语法的非ORM数据访问组件 [8/2 更新至v1.0.0.9 beta - 修复NBearLite参考手册某些操作系统打开错误的问题]

NBearLite是一个基于NBear的强类型查询内核的.NET 2.0开源(BSD协议)的通用数据访问组件。由NBear.orgTeddy维护。NBearLite继承了和进一步简化扩展了NBear中类似LINQ的强类型数据库查询语法(支持CRUD简单查询及GroupBy、InnerJoin,Paging等常用复杂查询),简化了命名空间、代码架构,并进一步简化了用户使用,对已有代码也没有任何侵入。NBearLite不是一个ORM工具,它不涉及实体类,NBearLite的所有查询返回Scalar/DataSet/IDataReader。


使用演示

无论是在新建的程序还是已有的程序中使用NBearLite,步骤都差不多,非常简单。

1、使用NBearLite提供的NBearLite.QueryColumnsGenerator.exe工具从已有数据库(可以是SqlServer、Oracle、MsAccess、MySql、Sqlite或PostgreSql),为表和视图生成强类型查询辅助类,并将生成的代码文件引用到项目工程。

2、在项目中引用NBearLite.dll(该DLL内置了SqlServer、Oracle和MsAccess的DbProvider,如果需要使用MySql、Sqlite或PostgreSql数据库,则还需要引用NBearLite.AdditionalDbProviders.dll)。

3、在项目的Web.config或App.config中的ConnectionStrings配置块中添加connectionstring。添加的语法可以和ADO.NET配置的标准语法一样,也可以简化设置,将providerName设为空(默认为sqlserver), sqlserver, sqlserver2005, msaccess, oracle, mysql,sqlite或postgresql

4、接着就可以直接在项目中实例化NBearLite.Database对象,并使用Database对象访问数据库了。


具体的使用代码可以参见NBearLite.Test工程。

例如:

在NBearLite.Test工程中,SampleQueryColumnsDefinition.cs文件中保存了由NBearLite.QueryColumnsGenerator.exe工具生成的Northwind数据库的所有表和视图的强类型查询辅助类。

在DatabaseTest.cs文件中,包含了一些查询演示:

 1        [TestMethod]
 2        public void TestInsert()
 3        {
 4            Assert.AreEqual(1, db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").Execute());
 5            Assert.IsTrue(db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").ExecuteReturnAutoIncrementID(Northwind.Categories.CategoryID) > 1);
 6        }

 7
 8        [TestMethod]
 9        public void TestUpdate()
10        {
11            Assert.AreEqual(1, db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").Execute());
12            Assert.IsTrue(db.Update(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test1").Where(Northwind.Categories.CategoryName == "test1").Execute() > 0);
13        }

14
15        [TestMethod]
16        public void TestDelete()
17        {
18            Assert.AreEqual(1, db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test111").Execute());
19            Assert.IsTrue(db.Delete(Northwind.Categories).Where(Northwind.Categories.CategoryName == "test111").Execute() > 0);
20        }

21
22        [TestMethod]
23        public void TestSelect()
24        {
25            DataSet ds = db.Select(Northwind.Categories).ToDataSet();
26            Assert.IsTrue(ds.Tables[0].Rows.Count > 0);
27            ds = db.Select(Northwind.Categories, Northwind.Categories.CategoryName).Where(Northwind.Categories.CategoryID > 0).ToDataSet();
28            Assert.IsTrue(ds.Tables[0].Rows.Count > 0);
29            ds = db.Select(Northwind.Categories, Northwind.Categories.CategoryName).GroupBy(Northwind.Categories.CategoryName).OrderBy(Northwind.Categories.CategoryName.Desc).SetSelectRange(22, Northwind.Categories.CategoryName).ToDataSet();
30            ds = db.Select(Northwind.Categories, Northwind.Categories.__Alias("CategoriesAlias").CategoryName).Join(Northwind.Categories, "CategoriesAlias", Northwind.Categories.CategoryID == Northwind.Categories.__Alias("CategoriesAlias").CategoryID).
31                SetSelectRange(22, Northwind.Categories.CategoryID).Where(Northwind.Categories.CategoryName.Length > 0 && Northwind.Categories.__Alias("CategoriesAlias").Description != null).
32                ToDataSet();
33        }

前三个Test都比较容易理解。TestSelect()中,分别演示了简单查询,分页GroupBy查询和一个自关联Join分页查询。

除了以上演示的代码之外,还可以使用Database.CustomSql()/Database.StoredProcedure()方法查询自定义sql或存储过程。


另外,NBearLite.QueryColumnsGenerator.exe工具本身也是一个使用NBearLite查询数据库的实际的实例程序。


下载

NBearLite_v1.0.0.9 Beta 及中文版NBearLite完全参考手册

修订

7/21 更新至v1.0.0.2 beta - 新增PostgreSql DbProvider,Insert/Update/Select/Delete方法的参数有部分修改,请注意参考以上已更新的的实例代码。
7/22 更新至v1.0.0.3 beta - 修复PostgreSql DbProvider中的Bug。
7/24 更新至v1.0.0.4 beta - 全面支持SqlServer,Oracle,MySql,PostgreSql数据库存储过程调用代码生成(C#/VB.NET)使用示例
7/27 更新至v1.0.0.5 beta - 支持Sub Query查询

Sub Query示例:

 1            //SELECT * FROM [Products] WHERE ([Products].[CategoryID] IN ((SELECT TOP 10 [Categories].[CategoryID] FROM [Categories] ORDER BY [Categories].[CategoryID])))    
 2            DataSet ds = db.Select(Northwind.Products)
 3                .Where(Northwind.Products.CategoryID.In
 4                (
 5                    db.Select(Northwind.Categories, Northwind.Categories.CategoryID).SetSelectRange(100, Northwind.Categories.CategoryID).ToSubQuery())
 6                )
 7                .ToDataSet();
 8
 9            //SELECT * FROM [Products] WHERE ([Products].[CategoryID] = (SELECT TOP 1 [Categories].[CategoryID] FROM [Categories] ORDER BY [Categories].[CategoryID]))
10            ds = db.Select(Northwind.Products)
11                            .Where(Northwind.Products.CategoryID ==
12                            (
13                                db.Select(Northwind.Categories, Northwind.Categories.CategoryID).SetSelectRange(10, Northwind.Categories.CategoryID).ToSubQuery())
14                            )
15                            .ToDataSet();
16            Assert.IsTrue(ds.Tables[0].Rows.Count > 0);

7/28 更新至v1.0.0.6 beta - 支持Save DataTable/DataRow

Save DataTable/DataRow示例:

 1SelectSqlSection selectSection = db.Select(Northwind.Categories)
 2  .Where(Northwind.Categories.CategoryID == catID)
 3  .OrderBy(Northwind.Categories.CategoryID.Desc)
 4  .SetSelectRange(10, Northwind.Categories.CategoryID);
 5DataTable dt = selectSection.ToDataSet().Tables[0];
 6
 7dt.Rows[0]["CategoryName"= "modified";
 8
 9//save a modified row
10db.Save(selectSection.ToDbCommand(), 10, dt);
11
12dt.Rows[0]["CategoryName"= "modified2";
13
14DataRow newRow = dt.NewRow();
15newRow["CategoryName"= "new";
16dt.Rows.Add(newRow);
17
18//save 1 modified row and insert a new row
19db.Save(selectSection.ToDbCommand(), tran, 0, dt.Rows[0], dt.Rows[1]);

7/29 更新至v1.0.0.7 beta - 发布中文版NBearLite完全参考手册
7/30 更新至v1.0.0.8 beta - 为Stored Procedure包装方法增加带Transaction重载
8/2 更新至v1.0.0.9 beta - 修复NBearLite参考手册某些操作系统打开错误的问题

posted on 2007-07-20 13:15 Teddy's Knowledge Base 阅读(7030) 评论(47)  编辑 收藏 所属分类: Ent. App. Dev.NBear

评论

#1楼  2007-07-20 13:25 吕 [未注册用户]

稍候研究   回复  引用    

#2楼  2007-07-20 14:16 随风流月      

好东西,不过 LINQ 也快出来了,要以易用性为主。   回复  引用  查看    

#3楼  2007-07-20 14:23 A.Z [未注册用户]

不久就要撞墙了,lz要有准备...
teddy bear...   回复  引用    

#4楼  2007-07-20 14:54 try [未注册用户]

算是 nbear的分离版本?   回复  引用    

#5楼 [楼主] 2007-07-20 15:04 Teddy's Knowledge Base      

@try
算是nbear中去除实体部分后的简化增强版。保留了nbear中最稳定的查询部分。   回复  引用  查看    

#6楼  2007-07-20 15:11 try [未注册用户]

不知以后nbear发展路线?   回复  引用    

#7楼 [楼主] 2007-07-20 15:14 Teddy's Knowledge Base      

@try
nbear v4应该会是延续nbear v3和NBearLite内核的.net 3.X以上版本的集成。   回复  引用  查看    

#8楼  2007-07-20 21:31 zschao [未注册用户]

gy.zschao@163.com   回复  引用    

#9楼  2007-07-20 21:32 zschao [未注册用户]

少一个System.ServiceModel.dll,谁能发给我
gy.zschao@163.com   回复  引用    

#10楼  2007-07-20 22:13 jianyi0115      

@zschao
System.ServiceModel不是系统类库吗?   回复  引用  查看    

#11楼  2007-07-21 07:20 菌哥      

一直关注和使用NBear,支持一下   回复  引用  查看    

#12楼  2007-07-21 10:01 stonezhu      

在用NBEAR做项目,感觉挺不错的,不过有个问题
就是在我重新改变entity里面的字段时building entity desgin project,会重新建我的Database,这样开始用的挺爽(装了生成插件).后面我觉得应该修改Database,不是重新生成.   回复  引用  查看    

#13楼  2007-07-21 21:10 帝之晓 [未注册用户]

刚刚试用觉得非常不错,有个问题想请教下,
上面的例子里有一个这样的语句
ds = db.Select("Categories", Northwind.Categories.CategoryName).Where(Northwind.Categories.CategoryID > 0).ToDataSet();

我的问题是如果要模糊查询应该怎么写,就是sql 语句里面的 categoryId like "xxx%" 这样的。
盼赐教。   回复  引用    

#14楼 [楼主] 2007-07-21 23:09 Teddy's Knowledge Base      

7/21 更新至v1.0.0.2 beta - 新增PostgreSql DbProvider,Insert/Update/Select/Delete方法的参数有部分修改,请注意参考以上已更新的的实例代码。
  回复  引用  查看    

#15楼 [楼主] 2007-07-21 23:13 Teddy's Knowledge Base      

@帝之小
可以象下面这样:
ds = db.Select("Categories", Northwind.Categories.CategoryName).Where(Northwind.Categories.CategoryID > 0 && Northwind.Categories.CategoryName.StartsWith("xxx")).ToDataSet();
 
还有很多字段的函数可以使用,包括字符串处理和时间处理的函数。所有的查询条件也可以&& || + - !等任意强类型运算符组合。
  回复  引用  查看    

#16楼  2007-07-22 14:38 随风流月      

@Teddy's Knowledge Base
以后应该和 3.5 的 LINQ 语法集成,不过这样不知道和 LINQ to SQL 比还存不存在优势了。应该重点和 Linq to SQL 不同,才能找到生存空间,例如对更多数据库支持,以及更多特性的不同。   回复  引用  查看    

#17楼  2007-07-23 17:07 随风流月      

@Teddy's Knowledge Base
嗯,组合。   回复  引用  查看    

#18楼  2007-07-23 17:20 帝之晓 [未注册用户]

非常感谢teddy

我很看好nbear~   回复  引用    

#19楼  2007-07-24 08:38 JerryChou      

NBearLite这个名字表意不准确,建议改名NBearData或NBearCore或其他。   回复  引用  查看    

#20楼 [楼主] 2007-07-24 09:39 Teddy's Knowledge Base      

@JerryChou
之所以叫NBearLite而不是NBearData是因为不希望大家认为这是一个必须和nbear的其它组件一起使用的组件,而是一个可独立使用的组件。nbear v4系列的所有组件,都将是互相松散耦合,可灵活搭配第三方产品使用的组件。   回复  引用  查看    

#21楼  2007-07-24 10:41 JerryChou      

@Teddy's Knowledge Base
NBearData顾名思义就是跟数据库操作有关,我觉得跟NBearMapping,NBearEntity等一起更容易让人理解各自的功用,反到NBearLite中的lite指轻量版,精简版会更让大家认为这是一个必须和nbear的其它组件一起使用的组件。   回复  引用  查看    

#22楼  2007-07-24 22:21 cw [未注册用户]

觉得楼上说得有道理.....

命名实际上也大有学问, 好的命名是一看就知道他大概的含义.... 哪就是成功的命名.....

Teddy's 很佩服他的技术... 但毕竟还是一个人.... 总有一些细节难免没有考虑周全....   回复  引用    

#23楼  2007-07-29 20:03 MK2      

呵呵,太方便了......简单易用。   回复  引用  查看    

#24楼  2007-07-29 21:31 Lumberw [未注册用户]

一直关注这个项目,非常好用,简单并且支持的数据库多,谢谢Teddy。
不过我觉得为了和以前的版本比较起来变化小一点的话,建议还是保留From(Northwind.Category)这个方法,把Select(...)等方法里面的第一个参数提出来,这样也和LINQ的语法更加接近一些。   回复  引用    

#25楼  2007-07-30 09:03 孤帆 [未注册用户]

跟LINQ有什么区别呢?
linq给微软都嵌套在类库里了,这个东西就可能...
不过拿来研究到是很好!   回复  引用    

#26楼 [楼主] 2007-07-30 10:15 Teddy's Knowledge Base      

@孤帆
LINQ还没有正式发布,而且,LINQ太for SQL Server了,支持的数据库很有限,就算支持也有太多功能是SQL Server专用的。而且,至少近几年,大多数公司不会那么快应用LINQ,而且还有很多已存在的项目,不可能应用LINQ。。。。太多即使LINQ存在,甚至比NBearLite优秀(该命题值得怀疑~)NBearLite也绝对有存在的意义了。   回复  引用  查看    

#27楼  2007-07-31 21:58 pinang [未注册用户]

不知为什么,我用NBearLite.QueryColumnsGenerator.exe连接Oracle 10G的数据库看不到任何表,连接是成功的。   回复  引用    

#28楼  2007-07-31 22:25 pinang [未注册用户]

看了一下QueryColumnsGenerator的源代码,发现连接Oracle有如下SQL:
select * from user_tables where (not table_name like '%$%') and TABLESPACE_NAME = 'SYSTEM' and TABLE_NAME <> 'SQLPLUS_PRODUCT_PROFILE' and TABLE_NAME <> 'HELP'
我的数据表没有放在SYSTEM的表空间中,所以列表中没数据,去除对TABLESPACE_NAME的匹配后就能检索到数据表了,希望Teddy改进一下。   回复  引用    

#29楼  2007-08-01 13:58 老夫子系      

我的数据表是有前缀的,而NBearLite.QueryColumnsGenerator.exe工具生成的代码也是有前缀的.请问: 如何处理才能去掉前缀呀?   回复  引用  查看    

#30楼 [楼主] 2007-08-01 14:06 Teddy's Knowledge Base      

@老夫子系
NBearLite.QueryColumnsGenerator.exe工具生成的代码一般会用两个以上的下划线作前缀,你定义的表或字段名称不会也有两个以上下划线前缀吧?   回复  引用  查看    

#31楼  2007-08-01 14:54 老夫子系      

@Teddy's Knowledge Base
我的意思是,如果我的表名定义的是nuke_Module, 则NBearLite.QueryColumnsGenerator.exe工具生成的代码是Nuke.nuke_Module. 我是希望表名的前缀nuke_能否在生成代码的时候去掉.变成Nuke.Module.
也就是说,生成代码类中的Module映射到数据库中的nuke_Module表.
  回复  引用  查看    

#32楼 [楼主] 2007-08-01 15:06 Teddy's Knowledge Base      

@老夫子系
这个没有内置支持,不过你可以自己修改生成的代码,比如,对所有的QueryColumn类的属性名,删掉你不要的前缀。   回复  引用  查看    

#33楼  2007-08-08 12:48 GoKu [未注册用户]

看来Nbear的发展方向是可以让用户自由选择LINQ或者NbearLite   回复  引用    

#34楼  2007-08-23 07:08 Vincent Yang      

今天早晨发现一个问题,就是在Access的GUID类型无法insert,出现failed to convert错误   回复  引用  查看    

#35楼  2007-08-24 15:00 program [未注册用户]

感觉很不错   回复  引用    

#36楼  2007-08-27 13:22 Reeezak      

@Vincent Yang

能否说说具体的情况?
谢谢~~   回复  引用  查看    

#37楼  2007-08-31 15:13 边城浪 [未注册用户]

企业库3.1 中的数据访问块也解决的同样的问题..
只是目前只支持MS SQL 和 Oracle 其它的要自己实现接口...   回复  引用    

#38楼  2007-09-01 23:19 Vincent Yang      

3.1可以很好支持Access,不知楼上的说得哪里不支持?   回复  引用  查看    

#39楼  2007-09-12 11:25 Lanny      

想询问一下,如果使用 强类型查询语法 , 比如我想 得到 数据表 某个字段符合一定条件的值如何写,比如 我想得到

Northwind.Categories.CategoryID 但 条件是 CategoryName == "Condiments" 的信息.

谢谢~   回复  引用  查看    

#40楼  2007-11-07 22:34 swan [未注册用户]

我够笨的了,弄了半天,就没能插入一条5个字段的记录。
db.Insert(Northwind.Categories).AddColumn(Northwind.Categories.CategoryName, "test cat").Execute() 到低有什么用?难道所有表都只有一个字段?搞不懂。难用。   回复  引用    

#41楼  2007-11-08 10:05 javafun [未注册用户]

@swan
一个个往后add就可以了   回复  引用    

#42楼  2008-02-15 22:43 Ben Li [未注册用户]

有一个BUG:ToSingleObject 方法中 如果T类型是一个自定义实体对象,这个实体对象不在Mapping.config配置文件中.将出现错误.你可以运行databasetest.cs中的TestSelect()方法,_Category cat = db.Select(Northwind.Categories).ToSingleObject<_Category>(); 这条语句执行有错误.   回复  引用    

#43楼  2008-07-12 11:23 小龙3      

@帝之晓
模糊查询:
Northwind.Categories.CategoryName.Like("%test%")   回复  引用  查看    

#44楼  2008-07-25 10:05 gengyu [未注册用户]

我再Winfrom中的App.Config中配置数据库路径如下:
<add name="dbZHB" connectionString=" Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DB\ZHB.mdb;Persist Security Info=True;Jet OLEDB:Database Password=zhbgengyu3.0" providerName="access" />

实际中数据库存放路径 bin\Debug\DB\ZHB.mdb 也对,
但是在调试时,提示错误:"...\bin\Debug\App_Data\DB\省局.mdb"不是一个有效的路径。

我就奇怪了,路径中怎么会多了一个“App_Data”呢?这事Web下才出现的啊?   回复  引用