概要
SQL Artisan是.NET基于SQL語句的數(shù)據(jù)訪問組件,它目的是在.NET環(huán)境下快速的創(chuàng)建SQL語句并執(zhí)行,從而讓開發(fā)人員更有效率地創(chuàng)建數(shù)據(jù)庫訪問代碼。SQL Artisan除在生成和運(yùn)行的是標(biāo)準(zhǔn)SQL語句外,在生SQL語句過程中所有值都是通過參數(shù)方式進(jìn)行傳遞從而解決SQL注入的安全問題。組件的運(yùn)算符和比較運(yùn)算符是基于.NET的實(shí)現(xiàn),所以在編譯過程中就可以檢測語法的合法性,大大減少了開發(fā)過程編寫SQL 語句拼寫錯(cuò)誤的問題。組件除了對標(biāo)準(zhǔn)SQL的支持外,還對數(shù)據(jù)庫函進(jìn)行擴(kuò)展,讓開發(fā)人員更靈活地創(chuàng)建數(shù)據(jù)庫操作代碼。
Query對象是SQL Artisan組件的主要成員之一,它是SELECT語句基于.NET對象化的實(shí)現(xiàn);最終的目的是通過Query對象來解決全部SELECT查詢語句的編寫。
Query對象現(xiàn)在所支持的功能
1)支持單表和多表查詢;包括INNER JOIN,LEFT JOIN,RIGHT JOIN等操作。
2)支持字段的運(yùn)算符;包括:+,-,*,/
3)支持字段的比較運(yùn)算符;包括:=,<>,>,>=,<,<=,in,ont in,like, BETWEEN,
not BETWEEN等。
4)支持聚合函數(shù):Sum,Count,Avg,Max,Min
5)支持?jǐn)?shù)據(jù)庫的擴(kuò)展函數(shù):Year,Month,Len,Left,SubString等。
6)支持?jǐn)?shù)據(jù)分組。
7)支持?jǐn)?shù)據(jù)排序。
Query的處理對象
在Select語句中主要處理的對象就是表和字段,同樣Query中主要處理的對象也是一樣。只是表和字段都在.NET中定義相應(yīng)的類型;分別是Hfsoft.Data.ExPRessions.Table和HFSoft.Data.Expressions.TableField。
HFSoft.Data.Expressions.Table
表描述對象,它用于提供Query需要查詢的表信息。
可以通過以下方式來定義一個(gè)表對象:
private HFSoft.Data.Expressions.Table TBL= new HFSoft.Data.Expressions.Table("Orders");
表對象提供關(guān)聯(lián)方法用于生關(guān)聯(lián)的表對象:
.INNER JOIN建立兩個(gè)表的關(guān)聯(lián)表
1)創(chuàng)建Employees,Orders的關(guān)聯(lián)表對象:
IQuery query = session.CreateQuery(Employees.TBL.INNER(Orders.TBL,Employees.F_EmployeeID))
2)創(chuàng)建Employees,Orders,Customers的關(guān)聯(lián)表對象:
IQuery query = session.CreateQuery(Employees.TBL.INNER(Orders.TBL,Employees.F_EmployeeID)&Orders.TBL.INNER(Customers.TBL,Orders.F_CustomerID));
.LEFT JOIN建立兩個(gè)表的左連接關(guān)聯(lián)表
IQuery query = session.CreateQuery(Employees.TBL.LEFT(Orders.TBL,Employees.F_EmployeeID));
.RIGHT JOIN建立兩個(gè)表的右連接關(guān)聯(lián)表
IQuery query = session.CreateQuery(Employees.TBL.RIGHT(Orders.TBL,Employees.F_EmployeeID));
HFSoft.Data.Expressions.TableField
字段描述對象,它用于提供Query需要查詢的字段信息
可以通過以下方式定義一個(gè)字段對象:
private HFSoft.Data.Expressions.TableField F_mOrderID = new HFSoft.Data.Expressions.TableField("OrderID");
字段對象提供豐富的運(yùn)算功能,包括比較運(yùn)算和數(shù)據(jù)庫函數(shù)等。
運(yùn)算功能:+,-,*,/
比較功能:==,!=,>,>=,<,<=,Like,In,NotIn, Match, Between, NotBetween
聚合函數(shù):Max,Min,Count,Sum,Avg
組合運(yùn)算:&,|
數(shù)據(jù)庫擴(kuò)展函數(shù):
MSSQL: CAST, ABS, FLOOR, DATEADD,YEAR,MONTH,DAY等。
其它數(shù)據(jù)暫時(shí)沒提供。
Query組成部分
Table屬性
獲取或設(shè)置需要查詢的表對象,可以通過表的關(guān)聯(lián)方法創(chuàng)建關(guān)聯(lián)表對象。些屬性不能為null。
Selects屬性
獲取或設(shè)置查詢的字段對象集,此屬可以為null。當(dāng)為null時(shí)如果查詢的表是單表則表示返回表的所有字段否則回基礎(chǔ)表的所有字段。
可以通過字段的相關(guān)組合來產(chǎn)生新的查詢字段;如:字段+,-,*,/運(yùn)算,還可以套用聚合函數(shù)和數(shù)據(jù)庫函數(shù)等。
1)IQuery query = session.CreateQuery(OrderDetails.TBL);
query.Selects = new TableField[]{SqlMath.Count(OrderDetails.ALL).As("CountValue"),OrderDetails.F_OrderID};
2)IQuery query = session.CreateQuery(Employees.TBL);
query.Selects = new TableField[]{(Employees.F_LastName +Employees.F_LastName).As("Name"),Employees.ALL};
Expreesion屬性
獲取或設(shè)置條表達(dá)式,此屬可以為null。當(dāng)為null時(shí)查詢獲取表的所有記錄。
條件表達(dá)式可以通過字段對象的比較運(yùn)算和組合運(yùn)算符產(chǎn)生,比較過程中字段可以調(diào)用運(yùn)算符或數(shù)據(jù)庫函數(shù)。
1) IQuery query = session.CreateQuery(Orders.TBL);
query.Expreesion = Orders.F_EmployeeID ==3 & (Orders.F_OrderDate.Between("1996-6-1", "1996-8-1")|Orders.F_OrderDate.Between("1997-6-1", "1997-8-1"));
OrderBy屬性
獲取或設(shè)置排序字段對象集,此屬性可以為null。當(dāng)為null時(shí)查詢過程不對任何字段進(jìn)行排序。
1) IQuery query = session.CreateQuery(Orders.TBL);
query.OrderBy = new TableField[]{Orders.F_EmployeeID.DESC,Orders.F_OrderDate.ASC};
GroupBy屬性
獲取或設(shè)置分組字段對象集,些屬性可以為null。當(dāng)為null時(shí)查詢過程不進(jìn)行分組。
1) IQuery query = session.CreateQuery(OrderDetails.TBL);
query.Selects = new TableField[]{SqlMath.Max(OrderDetails.F_Quantity).As("MaxValue"),OrderDetails.F_OrderID};
query.GroupBy = new TableField[]{OrderDetails.F_OrderID};
System.Data.DataSet ExecuteDataSet()
該方法是生成并執(zhí)行相關(guān)的SQL語句,把獲取的數(shù)據(jù)填充到DataSet對象中并返回。
Query用例
SQL:
select * from orders where orderid>10300 and orderid<10500;
SQL Artisan:
using(IDataSession session = MappingContainer.ConfigContainer.OpenSession())
{
session.Open();
IQuery query = session.CreateQuery(Orders.TBL);
query.Expreesion = (Orders.F_OrderID > 10300 & Orders.F_OrderID < 10500);
this.dataGrid1.DataSource = query.ExecuteDataSet().Tables[0];
}
SQL:
select orders.*,employees.* from orders inner join employees on orders.employeeid=employees.employeeid;
SQL Artisan:
using(IDataSession session = MappingContainer.ConfigContainer.OpenSession())
{
session.Open();
IQuery query = session.CreateQuery(Orders.TBL.INNER(Employees.TBL,Orders.F_EmployeeID));
query.Selects = new TableField[]{Orders.ALL.At(Orders.TBL),Employees.ALL.At(Employees.TBL)};
this.dataGrid1.DataSource = query.ExecuteDataSet().Tables[0];
}
SQL:
SELECT * FROM Orders where ( EmployeeID = 3 And ( (OrderDate BETWEEN '1996-6-1' And '1996-8-1' ) Or (OrderDate BETWEEN '1997-6-1' And '1997-8-1' ) ) )
SQL Artisan:
using(IDataSession session = MappingContainer.ConfigContainer.OpenSession())
{
session.Open();
IQuery query = session.CreateQuery(Orders.TBL);
query.Expreesion = Orders.F_EmployeeID ==3 & (Orders.F_OrderDate.Between( "1996-6-1", "1996-8-1")|Orders.F_OrderDate.Between("1997-6-1", "1997-8-1"));
this.dataGrid1.DataSource = query.ExecuteDataSet().Tables[0];
}
SQL:
SELECT Orders.* FROM Orders INNER JOIN [Order Details] ON Orders.OrderID=[Order Details].OrderID INNER JOIN Products ON [Order Details].ProductID=Products.ProductID INNER JOIN Categories ON Products.CategoryID=Categories.CategoryID where Categories.CategoryName like '%con%'
SQL Artisan:
using(IDataSession session = MappingContainer.ConfigContainer.OpenSession())
{
session.Open();
IQuery query = session.CreateQuery(Orders.TBL.INNER(OrderDetails.TBL,Orders.F_OrderID)
&OrderDetails.TBL.INNER(Products.TBL,OrderDetails.F_ProductID)
&Products.TBL.INNER(Categories.TBL,Products.F_CategoryID));
query.Selects = new TableField[]{Orders.ALL.At(Orders.TBL)};
query.Expreesion = Categories.F_CategoryName.At(Categories.TBL).Match("con");
this.dataGrid1.DataSource = query.ExecuteDataSet().Tables[0];
}
SQL:
SELECT Orders.* FROM Orders INNER JOIN [Order Details] ON Orders.OrderID=[Order Details].OrderID INNER JOIN Products ON [Order Details].ProductID=Products.ProductID INNER JOIN Categories ON Products.CategoryID=Categories.CategoryID where ( Categories.CategoryID = 3 And (Orders.OrderDate BETWEEN '1996-1-1' And '1996-12-31' ) )
SQL Artisan:
using(IDataSession session = MappingContainer.ConfigContainer.OpenSession())
{
session.Open();
IQuery query = session.CreateQuery(Orders.TBL.INNER(OrderDetails.TBL,Orders.F_OrderID)&
OrderDetails.TBL.INNER(Products.TBL,OrderDetails.F_ProductID)&
Products.TBL.INNER(Categories.TBL,Products.F_CategoryID));
query.Selects = new TableField[]{Orders.ALL.At(Orders.TBL)};
query.Expreesion = Categories.F_CategoryID.At(Categories.TBL) ==3 &
Orders.F_OrderDate.At(Orders.TBL).Between("1996-1-1","1996-12-31");
this.dataGrid1.DataSource = query.ExecuteDataSet().Tables[0];
}
--用例代碼下載--
SQL Artisan和SQL參照表
SQL | SQL Artisan | |
語句 | Select語句 | Query對象 |
Delete語句 | DeleteCommand對象 | |
Update語句 | UpdateCommand對象 | |
Insert Inser語句 | InsertCommand對象 | |
運(yùn)行符 | + | + |
- | - | |
* | * | |
/ | / | |
邏輯運(yùn)算符 | and | & |
or | | | |
聚合函數(shù) | Sum | SqlMath.Sum |
Max | SqlMath.Max | |
Min | SqlMath.Min | |
Count | SqlMath.Count | |
Avg | SqlMath.Avg | |
比較運(yùn)算符 | = | == |
<> | != | |
> | > | |
>= | >= | |
< | < | |
<= | <= | |
In | In | |
Not In | NotIn | |
Like | Like | |
Between | Between | |
Not Between | NotBetween | |
Match | ||
其他 | ASC | ASC |
DESC | DESC | |
( | ( | |
) | ) | |
MSSQL支持的函數(shù) | CAST | MSSqlMath.CAST |
ABS | MSSqlMath.ABS | |
FLOOR | MSSqlMath.FLOOR | |
CEILING | MSSqlMath.CEILING | |
DATEADD | MSSqlMath.DATEADD | |
DATEDIFF | MSSqlMath.DATEDIFF | |
DATENAME | MSSqlMath.DATENAME | |
DAY | MSSqlMath.DAY | |
MONTH | MSSqlMath.MONTH | |
YEAR | MSSqlMath.YEAR | |
LEFT | MSSqlMath.LEFT | |
LEN | MSSqlMath.LEN | |
REPLACE | MSSqlMath.REPLACE | |
RIGHT | MSSqlMath.RIGHT | |
STR | MSSqlMath.STR | |
SUBSTRING | MSSqlMath.SUBSTRING | |
新聞熱點(diǎn)
疑難解答
圖片精選