在C#中建立復(fù)雜的、靈活的SQL查詢/命令(2)_.Net教程
推薦:ASP.NET生成高質(zhì)量縮略圖通用函數(shù)(c#代碼)在網(wǎng)站開(kāi)發(fā)時(shí),生成縮略圖是一個(gè)非常常見(jiàn)和實(shí)用的功能.以前在asp里只能借助com組件實(shí)現(xiàn),現(xiàn)在在.net里可以利用框架的強(qiáng)大的類庫(kù)輕松實(shí)現(xiàn).下面帖出完整的代碼(帶詳細(xì)注釋),參考了網(wǎng)上的一些文章及.
你能看到,這種方式比直接使用連接字符串更直觀�?紤]到第一個(gè)例子SQL注入的危險(xiǎn),通過(guò)SelectQueryBuilder建立的SELECT查詢是非常安全的,并不用擔(dān)心使用的TextBoxs中的內(nèi)容。事實(shí)上它也非常簡(jiǎn)單!
使用SQL函數(shù)
如果你想在你的查詢中使用SQL函數(shù),你能使用SqlLiteral類來(lái)打包函數(shù)的調(diào)用。說(shuō)明這個(gè)類能作什么的最好方式就是給你顯示一小段代碼例子:
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
query.AddWhere("OrderDate", Comparison.LessOrEquals,new SqlLiteral("getDate()"));
如果我們沒(méi)有打包getDate()函數(shù)調(diào)用到SqlLiteral類中,建立的查詢就會(huì)產(chǎn)生WHERE子句:OrderDate<=’getDate()’。當(dāng)然,我們希望在語(yǔ)句中的這個(gè)函數(shù)沒(méi)有被單引號(hào)包圍。這時(shí)SqlLiteral就可以派上用場(chǎng)了:它直接拷貝字符串到輸出,并沒(méi)有把它格式化成字符串�,F(xiàn)在的輸出WHERE子句應(yīng)當(dāng)是OrderDate<=getDate()!
查詢中使用JOINs
要?jiǎng)?chuàng)建到其它表的JOINs,你能使用AddJoin方法。下面的代碼顯示了如何創(chuàng)建一個(gè)從Ordres表到Customers表的INNER JOIN。
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Orders");
query.AddJoin(JoinType.InnerJoin,"Customers", "CustomerID",Comparison.Equals,"Orders", "CustomerID");
query.AddWhere("Customers.City",Comparison.Equals, "London");
這段代碼選擇所有居住在London的客戶的訂單。一旦調(diào)用了BuildQuery方法,就會(huì)產(chǎn)生下面的SQL語(yǔ)句:
SELECT Orders.*
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE (Customers.City = 'London')
注意到缺省的查詢只會(huì)建立所選擇的表的selects * 語(yǔ)句(這個(gè)例子中的Orders.*)。如果你也想選擇連接表的列的話,你必須得顯式地選擇它們。你能通用調(diào)用query.SelectColumns(“Orders.*”,”Customers.*”)。
建立計(jì)算查詢
如果你想對(duì)你的數(shù)據(jù)庫(kù)執(zhí)行一個(gè)計(jì)算查詢。你能使用SelectCount方法如同下面顯示的:
Query.SelectCount();
在更加復(fù)雜的計(jì)算查詢中,你可能想使用GROUP BY語(yǔ)句�?匆幌孪旅娴睦�,它顯示了如何使用GroupBy和AddHaving方法。
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectColumns("count(*) AS Count", "ShipCity");
query.SelectFromTable("Orders");
query.GroupBy("ShipCity");
query.AddHaving("ShipCity", Comparison.NotEquals, "Amsterdam");
query.AddOrderBy("count(*)", Sorting.Descending);
上面的代碼選擇了每個(gè)城市的訂單數(shù),并用訂單數(shù)目排序,不考慮來(lái)自制Amsterdam的訂單,BuildQuery方法的輸出結(jié)果應(yīng)當(dāng)是:
SELECT count(*) AS Count, ShipCity
FROM Orders
GROUP BY ShipCity
HAVING (ShipCity <> 'Amsterdam')
ORDER BY count(*) DESC
復(fù)雜的Where語(yǔ)句
如果你曾經(jīng)用過(guò)微軟的Access或SQL Server的內(nèi)置的查詢生成器的話,是否驚訝你能建立和代碼一樣的包含多層ANDs和Ors,并沒(méi)有關(guān)心()符號(hào)的位置的查詢?是的?我也能!
你能使用SelectQueryBuilder類實(shí)現(xiàn)!你能加多層的WHERE語(yǔ)句到你的查詢。缺省,所有對(duì)query.AddWhere的調(diào)用被放在查詢的第一層上。你可以把它比作SQL Server查詢生成器的’Criteria’列;第二、三、四層等相應(yīng)地對(duì)應(yīng)于’Or…’列。
看一下下面的SQL Server查詢生成器的快照,通過(guò)它我能快速地把簡(jiǎn)單的假的SELECT語(yǔ)句放在一起來(lái):
如你看到的,我創(chuàng)建一個(gè)查詢,它選擇所有在1-1-2005日期之前的客戶’VINET’的訂單,和所有30-6-2004日期之前或1-1-2006日期之后的客戶’TOMSP’的訂單(請(qǐng)不要問(wèn)為什么有人想查詢某個(gè)人的訂單,這僅僅是一個(gè) 例子)。這個(gè)查詢能夠建立:
分享:asp.net里面的身份驗(yàn)證和授權(quán)今天閑著無(wú)聊.想起來(lái)了ASP.NET身份驗(yàn)證.感覺(jué)良好.貼出下列代碼: login.aspx HTML代碼 <%@ Page language="c#" Codebehind="02Login.aspx.cs" AutoEventWire
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- AJAX將成為移動(dòng)Web2.0時(shí)代首選開(kāi)發(fā)平臺(tái)
- FCKeditor 2.6在ASP.NET中的配置方法
- 解析TABLE導(dǎo)入到EXCEL
- 轉(zhuǎn)換DataSet到普通xml的新法
- ASP.NET學(xué)習(xí)篇(4)——服務(wù)器端的控件
- 解析VB.NET中的常量與枚舉功能
- 一個(gè)無(wú)刷新效果定時(shí)自動(dòng)更新頁(yè)面的例子
- 數(shù)據(jù)庫(kù)SqlParameter 的插入操作,防止sql注入的實(shí)現(xiàn)代碼
- ASP.NET頁(yè)面事件:順序與回傳詳解
- 七招制勝ASP.NET應(yīng)用程序開(kāi)發(fā)
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-在C#中建立復(fù)雜的、靈活的SQL查詢/命令(2)
。