ASP.NET三层架构之不确定查询参数个数的查询
在做三层架构的时候,特别是对表做查询的时候,有时候并不确定查询条件的个数,比如查询学生表:有可能只输入学号,或者姓名,或者性别,总之查询条件的参数个数并不确定,下面是我用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三层架构之不确定查询参数个数的查询的更多相关文章
- Asp.Net 三层架构之泛型应用
一说到三层架构,我想大家都了解,这里就简单说下,Asp.Net三层架构一般包含:UI层.DAL层.BLL层,其中每层由Model实体类来传递,所以Model也算是三层架构之一了,例外为了数据库的迁移或 ...
- asp.net三层架构 及其中使用泛型获取实体数据介绍
asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...
- 新闻公布系统 (Asp.net 三层架构 )
2012年度课程设计---新闻公布系统(小结) ...
- ASP.NET三层架构的分析
BLL 是业务逻辑层 Business Logic Layer DAL 是数据访问层 Data Access Layer ASP.NET的三层架构(DAL,BLL,UI ...
- ASP.NET三层架构项目创建流程
1.进入VS2010,新建项目—>Visual C#—>Web—>ASP.NET空Web应用程序,如图所示: 2.在解决方案处右击—>新建项目—>Windows—> ...
- 三层架构的一点理解以及Dapper一对多查询
1.首先说一下自己对三层架构的一点理解 论坛里经常说会出现喜欢面相对象的写法,所以使用EF的,我个人觉得他俩没啥关系,先别反对,先听听我怎么说吧. 三层架构,基本都快说烂了,但今天还是说三层架构:UI ...
- 初学者-asp.net三层架构
一.概述: 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).区分层次的目的即为了“高内聚,低耦合”的思想.是一种总体设计的思想. 1.表现层( ...
- asp.net三层架构详解
一.数据库 /*==============================================================*/ /* DBMS name: Microsof ...
- asp.net三层架构详解(转)
摘自:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html 一.数据库 ,) ) no ...
随机推荐
- 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制
回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...
- EF架构~linq to entity的随机排序问题
回到目录 对于从linq to sql迁移过来的开发者,对随机排序不会感到陌生,直接为datacontext添加一个方法再配合反射就可以实现随机排序了,代码如下: /// <summary> ...
- JS图片懒加载
简介 当页面图片太多时,加载速度就会很慢.尤其是用2G/3G/4G访问页面,不仅页面慢,而且还会用掉很多流量.图片懒加载的原理就是将页面内所有需要加载的图片全部换成一张默认的图片(一般尺寸很小),只有 ...
- Atitit 图像处理 灰度图片 灰度化的原理与实现
Atitit 图像处理 灰度图片 灰度化的原理与实现 24位彩色图与8位灰度图 首先要先介绍一下24位彩色图像,在一个24位彩色图像中,每个像素由三个字节表示,通常表示为RGB.通常,许多24位彩色图 ...
- JS 操作 DOM
定义:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 节点:(例如:< ...
- Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞
JS注入漏洞存在的Android版本:Android < 4.2 综述:Android的SDK中提供了一个WebView组件,用于在应用中嵌入一个浏览器来进行网页浏览.WebView组件中的ad ...
- jQuery学习易忘细节
1.类似于alert(""),但不会中断页面操作:console.log("last"); 2.javascript是HTML5以及所有现代浏览器中的默认脚本语 ...
- (转)rlwrap真是一个好东西
在Linux下面使用sqlplus很不爽,上下键,退格键都不能用,严重降低生产效率. 某一天终于发现了这个rlwrap这个好东西,特写此文记录. 下载地址如下: http://utopia.knowa ...
- 基于Metronic的Bootstrap开发框架经验总结(6)--对话框及提示框的处理和优化
在各种Web开发过程中,对话框和提示框的处理是很常见的一种界面处理技术,用得好,可以给用户很好的页面体验,Bootstrap开发也一样,我们往往在页面新增.编辑.查看详细等界面使用弹出对话框层的方式进 ...
- 数据可视化(7)--D3基础
一直想写写D3,觉得D3真心比较强大,基本上你能想出来的图表都能绘制出来,只不过使用起来比前几个要稍麻烦一点. 正好最近读完了<数据可视化实战>,将关于D3的知识梳理了一遍,写这篇博客记录 ...