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