在C#中建立復(fù)雜的、靈活的SQL查詢(xún)/命令_.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)大的類(lèi)庫(kù)輕松實(shí)現(xiàn).下面帖出完整的代碼(帶詳細(xì)注釋),參考了網(wǎng)上的一些文章及.
SelectQueryBuilder類(lèi)允許在你的代碼中建立復(fù)雜的SQL語(yǔ)句和命令。它也能幫助于避免SQL注入式攻擊。
介紹
承認(rèn),并且我們都這樣作過(guò),也認(rèn)為下面的方式是最好的和唯一的方式。就是我們建立大量的字符串包含所有的Where子句,然后提交到數(shù)據(jù)庫(kù)去執(zhí)行它。來(lái)斷的加語(yǔ)句到我們的SQL字符串,極有可能會(huì)帶來(lái)Bugs和SQL注入式攻擊的危險(xiǎn)。并且也使得我們的代碼更難看也不易于管理。
這種情況必須停止,但如何停止?有人說(shuō)使用存儲(chǔ)過(guò)程。但它并沒(méi)有真正的解決這個(gè)問(wèn)題。你還得動(dòng)態(tài)建立你的SQL語(yǔ)句,只不過(guò)有問(wèn)題移到數(shù)據(jù)庫(kù)層面上了,依然有SQL注入的危險(xiǎn)。除了這個(gè)“解決方案”外,可能還有非常多的選擇供你考慮,但它們都會(huì)帶來(lái)一個(gè)基本的挑戰(zhàn):讓SQL語(yǔ)句工作的更好、更安全。
當(dāng)我從我的在線DAL(數(shù)據(jù)訪問(wèn)層)生成工具h(yuǎn)ttp://www.code-engine.com/建立C#模板時(shí),我想提供一個(gè)易于使用的方法來(lái)定制查詢(xún)數(shù)據(jù)。我不再想使用“字符串查詢(xún)”(我以前開(kāi)發(fā)的模板)來(lái)查詢(xún)數(shù)據(jù)。我厭煩這種凌亂的方式來(lái)得到數(shù)據(jù)。我想用一種清晰的、直覺(jué)的、靈活的、簡(jiǎn)單的方式從表中選擇數(shù)據(jù),聯(lián)接一些別的語(yǔ)句,使用大量的Where子句,用一些列來(lái)分組數(shù)據(jù),返回前X個(gè)記錄。
我開(kāi)始開(kāi)發(fā)所想的有這種嚴(yán)密功能的SelectQueryBuilder類(lèi)。它暴露了許多屬性和方法,你能很容易地在Select語(yǔ)句中使用它們。一旦調(diào)用BuildQuery()和BuildCommand()方法,它能提供一種更好的舊的“字符串查詢(xún)“或可以使用命令參數(shù)的DbCommand對(duì)象來(lái)查詢(xún)數(shù)據(jù)。
使用代碼
舊的方式的代碼
下面的代碼闡明了以前建立SELECT語(yǔ)句的方法,它使用許多類(lèi)變量來(lái)說(shuō)明應(yīng)該使用那種連接操作(WHERE,或者OR),同時(shí)也給你的數(shù)據(jù)庫(kù)帶來(lái)了可能的SQL注入式攻擊。
string statement = "SELECT TOP " maxRecords " * FROM Customers ";
string whereConcatenator = "WHERE ";
if (companyNameTextBox.Text.Length > 0)
{
statement = whereConcatenator;
statement = "CompanyName like '" companyNameTextBox.Text "%' ";
whereConcatenator = "AND ";
}
if (cityTextBox.Text.Length > 0)
{
statement = whereConcatenator;
statement = "City like '" cityTextBox.Text "%' ";
whereConcatenator = "AND ";
}
if (countryComboBox.SelectedItem != null)
{
statement = whereConcatenator;
statement = "Country = '" countryComboBox.SelectedItem "' ";
whereConcatenator = "AND ";
}
我相信上面的代碼對(duì)你來(lái)說(shuō)是非常熟悉的,你可能在過(guò)去的十多年一直是這樣使用的,或者你曾經(jīng)編碼過(guò)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的搜索功能。讓我告訴你這種思想:這種查詢(xún)你的數(shù)據(jù)庫(kù)的方法不能再使用了,它是難看的也是不安全的。
SelectQueryBuilder方式的代碼
同樣的查詢(xún)能夠使用SelectQueryBuilder類(lèi)建立。
SelectQueryBuilder query = new SelectQueryBuilder();
query.SelectFromTable("Customers");
query.SelectAllColumns();
query.TopRecords = maxRecords;
if (companyNameTextBox.Text.Length > 0)
query.AddWhere("CompanyName", Comparison.Like,companyNameTextBox.Text "%");
if (cityTextBox.Text.Length > 0)
query.AddWhere("City", Comparison.Like,
cityTextBox.Text "%");
if (countryComboBox.SelectedItem != null)
query.AddWhere("Country", Comparison.Equals,
countryComboBox.SelectedItem);
string statement = query.BuildQuery();
// or, have a DbCommand object built
// for even more safety against SQL Injection attacks:
query.SetDbProviderFactory(
DbProviderFactories.GetFactory(
"System.Data.SqlClient"));
DbCommand command = query.BuildCommand();
分享: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查詢(xún)/命令
。