在做三层架构的时候,特别是对表做查询的时候,有时候并不确定查询条件的个数,比如查询学生表:有可能只输入学号,或者姓名,或者性别,总之查询条件的参数个数并不确定,下面是我用List实现传值的代码:

附图如下:

在这里附上数据库的表结构:

CREATE TABLE Student(
        StuId        VARCHAR(6) PRIMARY KEY,
        StuName   VARCHAR(10) NOT NULL,
        MajorId     INT NOT NULL,
        Sex           VARCHAR(2) NOT NULL DEFAULT '男',
        Birthdate   SMALLDATETIME NOT NULL,
        Credit        FLOAT,
        Remark     VARCHAR(200)
)

------------------------------------------------------------------------------------------------

程序代码如下:

Model层----------------------------------------------包含两个类------------------------

------------------表的实体类Student-----------------

public class Student
    {
        private string stuId; 
        public string StuId
        {
            get { return stuId; }
            set { stuId = value; }
        }

private string stuName;

public string StuName

{

get { return stuName; }

set { stuName = value; }

}

private int majorId;

public int MajorId

{

get { return majorId; }

set { majorId = value; }

}

private string sex;

public string Sex

{

get { return sex; }

set { sex = value; }

}

private DateTime birthdate;

public DateTime Birthdate

{

get { return birthdate; }

set { birthdate = value; }

}

private float credit;

public float Credit

{

get { return credit; }

set { credit = value; }

}

private string remark;

public string Remark

{

get { return remark; }

set { remark = value; }

}

}

------------------Condition主要用于传递参数,这个类也可以定义在别的地方-------------------

public class Condition
    {
        public string paramName { get; set; }
        public string paramValue { get; set; }
        public ConditionOperate Operation { get; set; }

// 查询所用到的运算操作符
        public enum ConditionOperate : byte
        {
            Equal,           // 等于
            NotEqual,      // 不等于
            Like,             // 模糊查询
            Lessthan,      // 小于等于
            GreaterThan  // 大于
        }
    }

---------------------DAL层-----------------------------------------------------------------

------------------DBHelper类---------------------------------------------

public class DBHelper

{

private SqlConnection conn;

private SqlCommand cmd;

private SqlDataAdapter sda;

private DataSet ds;

public DBHelper()

{

conn = new SqlConnection(ConfigurationManager.ConnectionStrings["key"].ConnectionString);

}

// 不带参数的查询

public DataSet GetResult(string sql, CommandType type)

{

cmd = new SqlCommand(sql, conn);

sda = new SqlDataAdapter(cmd);

conn.Close();

ds = new DataSet();

sda.Fill(ds, "student");

return ds;

}

// 带参数的查询

public DataSet GetResult(string sql, CommandType type, params SqlParameter[] paras)

{

cmd = new SqlCommand(sql, conn);

if (type == CommandType.StoredProcedure)

{

cmd.CommandType = CommandType.StoredProcedure;

}

cmd.Parameters.AddRange(paras);

sda = new SqlDataAdapter(cmd);

conn.Close();

ds = new DataSet();

sda.Fill(ds, "student");

return ds;

}

}

-----------------------------对Student表操作类

public class StudenDAL

{

public DataSet GetStudent(List<Condition> condition)

{

DataSet ds = new DataSet();

DBHelper db = new DBHelper();

string sql = "select * from student";

// 如果带查询语句带参数

if (condition.Count > 0)

{

sql += SqlString(condition);

ds = db.GetResult(sql, CommandType.Text, SqlParas(condition));

}

else

{

ds = db.GetResult(sql, CommandType.Text);

}

return ds;

}

----------------------以下两个可以写成一个类,以便如果有多张表时,可以实现代码的复用----------------------------------

// 获取查询参数

public SqlParameter[] SqlParas(List<Condition> cond)

{

List<SqlParameter> paras = new List<SqlParameter>();

for (int i = 0; i < cond.Count; i++)

{

SqlParameter para = new SqlParameter("@" + cond[i].paramName, cond[i].paramValue);

if (cond[i].Operation == Condition.ConditionOperate.Like)

{

para.SqlValue = "%" + cond[i].paramValue + "%";

}

paras.Add(para);

}

return paras.ToArray();

}

// 获取SQL查询语句的where子句

public string SqlString(List<Condition> cond)

{

string sqlWhere = string.Empty;

List<string> where = new List<string>();

// 数组元素的顺序应该与ConditionOperate枚举值顺序相同

string[] operateType = { " = ", " <> ", " Like ", " <= ", " >= " };

for (int i = 0; i < cond.Count; i++)

{

int index = (int)cond[i].Operation;

where.Add(string.Format("{0}" + operateType[index] + "{1}", cond[i].paramName, "@" + cond[i].paramName));

}

sqlWhere = " where " + string.Join(" and ", where.ToArray());

return sqlWhere;

}

}

------------------------------BLL层---------------------------

public class StudentBLL
    {
        private readonly StudenDAL stuDal = new StudenDAL();
        public DataSet GetStudent(List<Condition> condition)
        {
            return stuDal.GetStudent(condition);
        }
    }

------------------------------UI层,查询按钮的单击事件-------------------------------------

protected void btnSearch_Click(object sender, EventArgs e)

{

Condition condition;

StudentBLL stu = new StudentBLL();

List<Condition> list = new List<Condition>();

if (txtId.Text!="")

{

condition = new Condition()

{

paramName = "stuId",

paramValue = txtId.Text,

Operation = Condition.ConditionOperate.Equal

};

list.Add(condition);

}

if (txtName.Text!="")

{

condition = new Condition()

{

paramName = "stuName",

paramValue = txtName.Text,

Operation = Condition.ConditionOperate.Equal

};

list.Add(condition);

}

if (txtSex.Text != "")

{

condition = new Condition()

{

paramName = "Sex",

paramValue = txtSex.Text,

Operation = Condition.ConditionOperate.Equal

};

list.Add(condition);

}

GridView1.DataSource = stu.GetStudent(list);

GridView1.DataBind();

}

ASP.NET三层架构之不确定查询参数个数的查询的更多相关文章

  1. Asp.Net 三层架构之泛型应用

    一说到三层架构,我想大家都了解,这里就简单说下,Asp.Net三层架构一般包含:UI层.DAL层.BLL层,其中每层由Model实体类来传递,所以Model也算是三层架构之一了,例外为了数据库的迁移或 ...

  2. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  3. 新闻公布系统 (Asp.net 三层架构 )

    2012年度课程设计---新闻公布系统(小结)                                                                             ...

  4. ASP.NET三层架构的分析

    BLL   是业务逻辑层   Business   Logic   Layer DAL   是数据访问层   Data   Access   Layer ASP.NET的三层架构(DAL,BLL,UI ...

  5. ASP.NET三层架构项目创建流程

    1.进入VS2010,新建项目—>Visual C#—>Web—>ASP.NET空Web应用程序,如图所示: 2.在解决方案处右击—>新建项目—>Windows—> ...

  6. 三层架构的一点理解以及Dapper一对多查询

    1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI ...

  7. 初学者-asp.net三层架构

    一.概述: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合”的思想.是一种总体设计的思想. 1.表现层( ...

  8. asp.net三层架构详解

    一.数据库 /*==============================================================*/ /* DBMS name:      Microsof ...

  9. asp.net三层架构详解(转)

    摘自:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html 一.数据库             ,)   )     no ...

随机推荐

  1. 异步编程之Javascript Promises 规范介绍

    什么是 Promises Promises是一种关于异步编程的规范,目的是将异步处理对象和处理规则进行规范化,为异步编程提供统一接口. 传统的回调函数 说到JavaScript的异步编程处理,通常我们 ...

  2. NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...

  3. XMPie部署与创建过程 - 快速指南

    XMPie部署与创建过程 1PhotoShop.Indesign.VS2013关系.作用.使用 .1.1目的与过程 1. Photoshop负责导出cpkg文件. 1.1 动态性 如果你想要生成动态的 ...

  4. Java 9终于要包含Jigsaw项目了

    当Jigsaw在Java 9中最终发布时,这个项目的历史已经超过八年了. 转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/180.html? ...

  5. Programming in lua 杂记(转)

    1,loadstring 编译的时候不关心词法范围:   local i = 0   f = loadstring("i = i + 1") g = function () i = ...

  6. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  7. C#学习系列-this的使用

    如有错误,欢迎指正. 1.代表当前类,在当前类中可使用this访问当前类成员变量和方法(需要注意的是 静态方法中不能使用this),也可用于参数传递,传递当前对象的引用. 下面贴代码: class P ...

  8. iOS----Asset Catalog的用法

    文/余书懿(简书作者)原文链接:http://www.jianshu.com/p/7aa06ce22a7b著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 引言 Asset Catalo ...

  9. HTML中的title换行问题

    有时我们需要在html元素的title中换行显示信息.以下几种方法均可以实现: 直接在titile属性中使用换行,如下所示: asd">asdsadsad</a> 在tit ...

  10. G2 DT时代的图形语法 正式发布

    G2有一个高大上的名字叫做:The Grammar Of Graphics——图形语法.它是一个强大的语义化图表生成工具,它提供了一整套图形语法,可以让用户通过简单的语法搭建出无数种图表,并且集成了大 ...