my openid
posts - 27, comments - 207, trackbacks - 26, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

NQL.Net 简介

Posted on 2006-10-30 08:58 风云 阅读(1478) 评论(15)  编辑 收藏 网摘 所属分类: .NETNDO

NQL.NET 是我最近在NDO(DOTNET DataAccess Object)的基础上并吸收了Hibernate,Rails框架中的活动记录,Castle中的活动记录,Grove,ActionPack,OQL的精华思想上建立的一套数据库对象查询语言(NQL,NDO Query Language)它支持 CRUD操作,也包括 selectfromjoinonwheregroup byhavingorder by case 子句。

本文中的代码都以SQL SERVER 2000中的数据库Northwind 做为例子,代码以CSharp为例,其中的例子都是我做过严格的测试.

数据库配置

<add key="ConnectionString" value="Data Source=localhost; Database=Northwind; Integrated Security=true;"/>

 

  导入NQL包 : using NDO;

1.Filter 过滤器

this.dataGrid1.DataSource = new Query("Products")
                .Filter(
"UnitPrice*UnitsInStock >=1000")
                .GetDataTable();

上面的程序生成的SQL 语句是

SELECT  * 
FROM Products 
WHERE 
    UnitPrice
*UnitsInStock >=1000

2.邦定参数的Filter 过滤器

this.dataGrid1.DataSource = new Query("Products")
                .Filter(
"UnitPrice*UnitsInStock >=@AA")
                .AddParam(
"AA",1000)
                .GetDataTable();

SQL 输出

SELECT  * 
FROM Products 
WHERE 
    UnitPrice
*UnitsInStock >=@AA

3.Where 的简单用法(该例子中用到了泛性的活动记录)

this.dataGrid1.DataSource = new ActiveRecord("Orders")
                .SelectCommand
                .Where(
"ShipVia",2)
                .Asc(
"CustomerID","OrderID")
                .GetDataTable();

SQL 输出

SELECT 
    
[OrderID],
    
[CustomerID],
    
[EmployeeID],
    
[OrderDate],
    
[RequiredDate],
    
[ShippedDate],
    
[ShipVia],
    
[Freight],
    
[ShipName],
    
[ShipAddress],
    
[ShipCity],
    
[ShipRegion],
    
[ShipPostalCode],
    
[ShipCountry]
FROM
    
[Orders]    
WHERE
    (
[Orders].[ShipVia]  = @ShipVia)
 
ORDER BY CustomerID,OrderID ASC 

4.子查询的运用

Query qryCustomer = new Query("Customers")
                .SelectColumn(
"CustomerID")
                .Where(
"ContactTitle","Owner");

            
this.dataGrid1.DataSource = new Query("Orders")
                .NewWhere(
"ShipVia",1)
                .And(Ex.In(
"CustomerID",qryCustomer)).GetDataTable();

SQL 输出

SELECT  * 
FROM Orders 
WHERE 
    
[Orders].[ShipVia]  = @ShipVia
    
AND [Orders].[CustomerID]  IN (
                                     SELECT 
                                        
[Customers].[CustomerID]
                                    
FROM Customers 
                                    
WHERE 
                                    (
[Customers].[ContactTitle]  = @ContactTitle)
                                    )

5.模糊查询

this.dataGrid1.DataSource = new Query("Customers")
                .NewWhere(Ex.Like(
"ContactTitle","Sales%"))
                .GetDataTable();

SQL  输出

SELECT  * 
FROM Customers 
WHERE 
    
[Customers].[ContactTitle]  LIKE @ContactTitle

6.投影和多表连接操作

 

Query q = new Query("Orders","a");
            
this.dataGrid1.DataSource = q
                .SelectColumn(
"OrderID")
                ._(
"OrderDate")
                ._(
"RequiredDate")
                ._(
"b","ProductID")
                .InnerJoin(
"Order Details").As ("b")
                    .On(q.NewCondition(
"OrderID"== q.NewCondition("b","OrderID"))
                .NewWhere(
"EmployeeID",5)
                .And(
"ShipVia",1)
                .GetDataTable();

 

SQL 输出

SELECT 
    
[a].[OrderID],
    
[a].[OrderDate],
    
[a].[RequiredDate],
    
[b].[ProductID]
FROM Orders a 
INNER JOIN [Order Details] b
    
ON [a].[OrderID]=b.[OrderID] 
WHERE 
    
[a].[EmployeeID]  = @a_EmployeeID
    
AND [a].[ShipVia]  = @a_ShipVia

7.简单的插入查询

new SimpleInsertQuery("Region").Values(this.textBox1.Text,this.textBox2.Text).Execute();
 
this.dataGrid1.DataSource = new Query("Region").GetDataTable();

SQL 输出

INSERT INTO [Region] VALUES ( 
    @RegionID,@RegionDescription
)

SELECT  * 
FROM Region 

8.插入语句2

new SimpleInsertQuery("Region").Columns("RegionID","RegionDescription").Values(this.textBox1.Text,this.textBox2.Text).Execute();
 
this.dataGrid1.DataSource = new Query("Region").GetDataTable();

SQL 输出

INSERT INTO [Region] (
    RegionID,RegionDescription
VALUES (
    @RegionID,@RegionDescription
)

SELECT  * 
FROM Region 

9.删除

new SimpleDeleteQuery("Region").Where("RegionID",this.textBox1.Text).Execute();
this.dataGrid1.DataSource = new Query("Region").Asc("RegionID").GetDataTable();

SQL 输出

DELETE FROM [Region]
WHERE 
    
[Region].[RegionID]  = @RegionID

SELECT  * 
FROM Region 
 
ORDER BY RegionID ASC 

10.删除2

new SimpleDeleteQuery("Region")
                .Filter(
"RegionID=@RegionID")
                .AddParam(
"RegionID",this.textBox1.Text)
                .Execute();
            
this.dataGrid1.DataSource = new Query("Region").Asc("RegionID").GetDataTable();

SQL 输出同上

11.删除3,默认按照数据中的主键进行删除

new SimpleDeleteQuery("Region")
                .Execute(
this.textBox1.Text);
            
this.dataGrid1.DataSource = new Query("Region").Asc("RegionID").GetDataTable();

SQL 输出同上

12. 更新操作

new SimpleUpdateQuery("Region")
                .Set(
"RegionDescription",this.textBox2.Text)
                .Where(
"RegionID",this.textBox1.Text)
                .Execute();

SQL 输出

UPDATE [Region] SET 
    
[Region].[RegionDescription]=@RegionDescription
WHERE 
    
[Region].[RegionID]  = @RegionID

SELECT  * 
FROM Region 
 
ORDER BY RegionID ASC 

13.计算列的加法运算(可以对计算列进行斯则混合运算)

Query q = new Query("Region");
            
this.dataGrid1.DataSource = q
                ._(q[
"RegionID"+ 10)
                ._(
"RegionDescription")
                .Asc(
"RegionID")
                .GetDataTable();

SQL 输出

SELECT 
    
[Region].[RegionID] + 10 AS [RegionID],
    
[Region].[RegionDescription]
FROM Region 
 
ORDER BY RegionID ASC 

14.计算列的乘法运算

Query q = new Query("Region");
  
this.dataGrid1.DataSource = q
                ._(q[
"RegionID"* 2 + 5)
                ._(
"RegionDescription")
                .Asc(
"RegionID").GetDataTable();

SQL   输出

SELECT 
    
[Region].[RegionID] * 2 + 5 AS [RegionID],
    
[Region].[RegionDescription]
FROM Region 
 
ORDER BY RegionID ASC

15.计算列的括弧运算

Query q = new Query("Region");
            
this.dataGrid1.DataSource = q
                ._((q[
"RegionID"+ 5)*2)
                ._(
"RegionDescription")
                .Asc(
"RegionID").GetDataTable();

SQL  输出

SELECT 
    (
[Region].[RegionID] + 5)  * 2 AS [RegionID],
    
[Region].[RegionDescription]
FROM Region 
 
ORDER BY RegionID ASC 

16.计算列的自增运算(自减运算同自增略)

Query q = new Query("Region");
            QueryColumn col 
= q["RegionID"];
            col 
= col ++;
            
this.dataGrid1.DataSource = q
                ._(col)
                ._(
"RegionDescription")
                .Asc(
"RegionID").GetDataTable();

  SQL 输出

SELECT 
    
[Region].[RegionID] + 1 AS [RegionID],
    
[Region].[RegionDescription]
FROM Region 
 
ORDER BY RegionID ASC 

下一篇

Feedback

#1楼    回复  引用  查看    

2006-10-30 09:27 by 沛沛      
看起来不错哟

给个东西来测试下哈

#2楼    回复  引用  查看    

2006-10-30 10:02 by dudu      
为什么删除原来的简介?
对于 http://www.cnblogs.com/Kimphi/archive/2006/10/29/543691.html ,建议解释一下。

#3楼 [楼主]   回复  引用  查看    

2006-10-30 10:54 by 风云      
dudu :你好,关于那个简介我已经向Kimphi仁兄解释了,我不想在那个问题上再发表任何评论,毕竟大家的目的一样,不是来吵架的,那样太伤和气了,望大家谅解

#4楼    回复  引用  查看    

2006-10-30 11:02 by dudu      
你解释后,把随笔删除了,别人并不知道你的解释,如果在 http://www.cnblogs.com/Kimphi/archive/2006/10/29/543691.html 中解释一下会更好。

#5楼 [楼主]   回复  引用  查看    

2006-10-30 11:52 by 风云      
嗯,好的,谢谢你!

#6楼    回复  引用    

2006-10-30 13:02 by je [未注册用户]
风云讲是开源的,不知道什么时候能出来啊

#7楼    回复  引用  查看    

2006-10-31 16:04 by ZergTant      
支持开源,顺便学习下

#8楼    回复  引用    

2006-11-08 11:01 by iret2 [未注册用户]
能发一个过来看看么?kylehuangyu#gmail.com,
Thanks

#9楼    回复  引用    

2006-11-22 13:38 by 匿名 [未注册用户]
支持,楼主已经把组件开放出来!

#10楼    回复  引用    

2006-11-25 15:11 by 虫虫[匿名] [未注册用户]
怎么在我下载的版本中没有SimpleInsertQuery,SimpleUpdateQuery,SimpleDeleteQuery类,而Query 类中有Insert,Update,Delete方法,请问楼主是不是把这3个类合并到Query类中了

#11楼 [楼主]   回复  引用  查看    

2006-11-25 15:25 by 风云      
@虫虫[匿名]
以前把查询分为Query,SimpleInsertQuery,SimpleUpdateQuery,SimpleDeleteQuery,现在全部统一到一个类中Query了,简化了操作

#12楼    回复  引用    

2006-12-01 11:53 by Ryan[匿名] [未注册用户]
支持Oracle吗?

#13楼 [楼主]   回复  引用  查看    

2006-12-01 11:54 by 风云      
@Ryan[匿名]
支持,新版本支持,:)

#14楼    回复  引用    

2006-12-01 15:14 by Ryan[匿名] [未注册用户]
能否发一份新版本及说明文挡给我?
ryan.y.s.lu@gmail.com

#15楼 [楼主]   回复  引用  查看    

2006-12-01 17:48 by 风云      
多谢你的关注,新版本马上会随着新的文章“再谈代码生成器”时一块发布,关于说明文档可能还需要几天 :)

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-11-22 14:52 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: