收 藏 投 稿 繁 体 RSS 
站长吧-中国站长学习与交流的网站
首 页 运 营 学 院 建 站 论 坛
Web master8.net  
 网站运营  
  欢迎在本站发布信息,在线投递稿件请点这里。编辑QQ:4908220,欢迎联系交流。
业界动态 创业故事 推广研究 策划盈利 电子商务 企业平台
  站长工具
SEO查询 Whois查询 Pr查询 域名查询 IP查询 网页编辑器
 建站服务  
  如有建站意向,请尽快联系我们,以便安排时间... 建站服务 QQ4908220 QQ:4908220
作品展示 服务范围 服务流程 服务报价 联系方式 付款方式
文章正文  » 您的当前位置: 首页 >> 学院 >> 程序开发 >> ASP.Net
在C#中建立复杂的、灵活的SQL查询/命令
  来源:互联网 | 时间:2007-05-29 | 浏览:   相关评论 | 报告错误 | 发布文章
【字号: | | 】 【背景色 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白(默认色)

SelectQueryBuilder类允许在你的代码中建立复杂的SQL语句和命令。它也能帮助于避免SQL注入式攻击。

  介绍

  承认,并且我们都这样作过,也认为下面的方式是最好的和唯一的方式。就是我们建立大量的字符串包含所有的Where子句,然后提交到数据库去执行它。来断的加语句到我们的SQL字符串,极有可能会带来Bugs和SQL注入式攻击的危险。并且也使得我们的代码更难看也不易于管理。

  这种情况必须停止,但如何停止?有人说使用存储过程。但它并没有真正的解决这个问题。你还得动态建立你的SQL语句,只不过有问题移到数据库层面上了,依然有SQL注入的危险。除了这个“解决方案”外,可能还有非常多的选择供你考虑,但它们都会带来一个基本的挑战:让SQL语句工作的更好、更安全。

  当我从我的在线DAL(数据访问层)生成工具http://www.code-engine.com/建立C#模板时,我想提供一个易于使用的方法来定制查询数据。我不再想使用“字符串查询”(我以前开发的模板)来查询数据。我厌烦这种凌乱的方式来得到数据。我想用一种清晰的、直觉的、灵活的、简单的方式从表中选择数据,联接一些别的语句,使用大量的Where子句,用一些列来分组数据,返回前X个记录。

  我开始开发所想的有这种严密功能的SelectQueryBuilder类。它暴露了许多属性和方法,你能很容易地在Select语句中使用它们。一旦调用BuildQuery()和BuildCommand()方法,它能提供一种更好的旧的“字符串查询“或可以使用命令参数的DbCommand对象来查询数据。

  使用代码

  旧的方式的代码

  下面的代码阐明了以前建立SELECT语句的方法,它使用许多类变量来说明应该使用那种连接操作(WHERE,或者OR),同时也给你的数据库带来了可能的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 ";
}

  我相信上面的代码对你来说是非常熟悉的,你可能在过去的十多年一直是这样使用的,或者你曾经编码过数据库驱动的搜索功能。让我告诉你这种思想:这种查询你的数据库的方法不能再使用了,它是难看的也是不安全的。

  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.SetDbProviderFactory(
  DbProviderFactories.GetFactory(
  "System.Data.SqlClient"));
  DbCommand command = query.BuildCommand();

master8
  • 上一篇:岳贵:如何做好一个论坛?
  • 下一篇:Skype出台海外赔偿方案

  • 我要投稿  打印本文  推荐本文  加入收藏  返回顶部  关闭窗口
    搜模板(www.somoban.com) 原创网站模板交易平台
    阿里妈妈再掀疯狂采购风,网站广告位严重告急,急召天下站长
    基于PHP+MySQL的整站、模块、插件开发等或者按需求实现相应功能;
基于各PHP主流建站系统CMS,BBS,BLOG等的模板定制,完全手写代码;
整站数据迁移或备份恢复;网页代码优化、重构;整站常规SEO优化;网站技术支持;
点击了解详情...
    站长论坛
    • 验证码: