在C#中建立復(fù)雜的、靈活的SQL查詢/命令
2007/1/12 21:43:50
SelectQueryBuilder類允許在你的代碼中建立復(fù)雜的SQL語句和命令。它也能幫助于避免SQL注入式攻擊。

  介紹

  承認(rèn),并且我們都這樣作過,也認(rèn)為下面的方式是最好的和唯一的方式。就是我們建立大量的字符串包含所有的Where子句,然后提交到數(shù)據(jù)庫去執(zhí)行它。來斷的加語句到我們的SQL字符串,極有可能會(huì)帶來Bugs和SQL注入式攻擊的危險(xiǎn)。并且也使得我們的代碼更難看也不易于管理。

  這種情況必須停止,但如何停止?有人說使用存儲(chǔ)過程。但它并沒有真正的解決這個(gè)問題。你還得動(dòng)態(tài)建立你的SQL語句,只不過有問題移到數(shù)據(jù)庫層面上了,依然有SQL注入的危險(xiǎn)。除了這個(gè)“解決方案”外,可能還有非常多的選擇供你考慮,但它們都會(huì)帶來一個(gè)基本的挑戰(zhàn):讓SQL語句工作的更好、更安全。

  當(dāng)我從我的在線DAL(數(shù)據(jù)訪問層)生成工具h(yuǎn)ttp://www.code-engine.com/建立C#模板時(shí),我想提供一個(gè)易于使用的方法來定制查詢數(shù)據(jù)。我不再想使用“字符串查詢”(我以前開發(fā)的模板)來查詢數(shù)據(jù)。我厭煩這種凌亂的方式來得到數(shù)據(jù)。我想用一種清晰的、直覺的、靈活的、簡(jiǎn)單的方式從表中選擇數(shù)據(jù),聯(lián)接一些別的語句,使用大量的Where子句,用一些列來分組數(shù)據(jù),返回前X個(gè)記錄。

  我開始開發(fā)所想的有這種嚴(yán)密功能的SelectQueryBuilder類。它暴露了許多屬性和方法,你能很容易地在Select語句中使用它們。一旦調(diào)用BuildQuery()和BuildCommand()方法,它能提供一種更好的舊的“字符串查詢“或可以使用命令參數(shù)的DbCommand對(duì)象來查詢數(shù)據(jù)。

  使用代碼

  舊的方式的代碼

  下面的代碼闡明了以前建立SELECT語句的方法,它使用許多類變量來說明應(yīng)該使用那種連接操作(WHERE,或者OR),同時(shí)也給你的數(shù)據(jù)庫帶來了可能的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ì)你來說是非常熟悉的,你可能在過去的十多年一直是這樣使用的,或者你曾經(jīng)編碼過數(shù)據(jù)庫驅(qū)動(dòng)的搜索功能。讓我告訴你這種思想:這種查詢你的數(shù)據(jù)庫的方法不能再使用了,它是難看的也是不安全的。

  SelectQueryBuilder方式的代碼

  同樣的查詢能夠使用SelectQueryBuilder類建立。

    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.SetDbPr

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 最近韩国电影免费观看完整版中文| 美日韩一区二区三区| 大桥未久恸哭の女教师| 久久久久无码精品国产| 欧美又大又粗又爽视频| 人妻互换一二三区激情视频| 老湿机69福利区18禁网站| 国产成人精品A视频一区| 3751色视频| 天天摸天天做天天爽| 两个人看的www免费视频中文| 日韩人妻无码一区二区三区综合部 | 把她抵在洗手台挺进撞击视频 | 中文字幕一区二区精品区| 日韩制服丝袜电影| 亚洲免费观看在线视频| 波多野结衣与老人| 免费在线观看h| 美女被免费网在线观看网站| 国产又黄又爽又刺激的免费网址| 视频免费在线观看| 国产黄a三级三级看三级| www国产亚洲精品久久久日本| 打开腿吃你的下面的水视频| 久久夜色精品国产噜噜| 最近最好的中文字幕2019免费| 亚洲欧美中文字幕专区| 特级毛片www俄罗斯免| 国产女人91精品嗷嗷嗷嗷| 色吧亚洲欧美另类| 国产自产拍精品视频免费看| XXX2高清在线观看免费视频| 婷婷六月丁香午夜爱爱| 中文字幕亚洲欧美专区| 日本一道综合久久aⅴ免费| 久久精品国产这里是免费| 果冻传媒国产电影免费看 | 另类欧美视频二区| 快穿之肉玩具系统| 中文字幕欧美日韩一| 日本一二区视频|