在winform做查询时,都会用到多条件查询。
比如这个页面:
用户也许每个查询条件都填,也许填1个,也许填2个等等。
这里按照三层的写法:
思路:
假设这里用的是 TblStudent 表
1. Mode
l文件夹里 首先建立2个类:
第一个类:存放表的字段,把这些字段当成属性。TblStudentModel.cs
第二个类:存放查询的字段、查询的运算符(这里可以采用枚举)、查询的值 等三个属性。TblStudentField.cs
2.UI层。
把要查询的条件,放到一个List集合里,传递给BLL层。
3.BLL层
,打酱油,把从UI层获取的查询条件传递给DAL层。TblStudentBll.cs
4.DAL:
主要就4个数据存放。 TblStudentDal.cs
第一个:查询语句
第二个:查询语句where 后面的条件
第三个:sql参数列表
第四个:得到数据后,返回的List集合
具体代码实现:
首先是Model层里:
1.TblStudentField.cs :存放查询的字段、运算符和查询的值
public class TblStudentField
{
//查询的字段名称
public string FieldName
{ get; set; }
//查询的运算符
public Operater Op
{ get; set; }
//查询的值
public string Value
{ get; set; }
}
//运算符的枚举
public enum Operater
{
Qt,
Lt,
Eq,
like
}
2.TblStudentModel.cs文件:存放表里的字段
public class TblStudentModel
{
//字段列表: tSId, tSName, tSGender, tSAddress, tSPhone, tSAge
public int Id
{ get; set; }
public string Name
{ get; set; }
public string Gender
{ get; set; }
public string Address
{ get; set; }
public string Phone
{ get; set; }
public int? Age
{ get; set; }
}
DAL层:存放具体查询的代码,里面要调用SqlHelper类里的方法。
TblStudentDal.cs文件里的代码:
public List<TblStudentModel> GetDataList(List<TblStudentField> tiaojians)
{
//存放查询后得到的集合
List<TblStudentModel> DataList = new List<TblStudentModel>();
//查询的sql语句,这里因为要拼接查询条件,所以使用的是StringBuilder类型
StringBuilder cmdtxt = new StringBuilder("select * from tblstudent ");
//查询条件,采用List<string>的类型来获取条件,最后与上面的语句拼接。
List<string> wheres = new List<string>();
//SqlParameter集合,作为Sql的参数。因为如果是数组的话,比较麻烦,还要定义长度。
List<SqlParameter> pms = new List<SqlParameter>();
//获取查询条件。
foreach (TblStudentField tiaojian in tiaojians)
{
//先定义个参数列表
SqlParameter pm = new SqlParameter("@" + tiaojian.FieldName, tiaojian.Value);
//判断Enum运算符,对比生成为Sql使用的运算符。
string yunsf = ""; //首先定义个运算符
switch (tiaojian.Op)
{
case Operater.Qt:
yunsf = " > ";
break;
case Operater.Lt:
yunsf = " < ";
break;
case Operater.Eq:
yunsf = " = ";
break;
case Operater.like:
yunsf = " like ";
pm.Value = "%" + pm.Value + "%";//因为如果是like运算符,那么查询的值2变要%%
break;
}
//等到的条件:类似于id=@id,或者age=@age
string tiaoj = tiaojian.FieldName + yunsf + "@"+tiaojian.FieldName;
//把单个条件添加到条件集合里
wheres.Add(tiaoj);
//把sql参数添加到参数集合里.
pms.Add(pm);
}
//先判断下where条件集合里是否有条件
if (wheres.Count > 0)
cmdtxt.Append(" where " + string.Join(" and ", wheres));//通过string 拼接条件集合。在每个条件中间加入 and
//根据查询条件,获取数据库里的数据,别忘了cmdtxt的类型是StringBuilder要转换下,还有pms的类型是List,也要转换下
using (SqlDataReader dr = SqlHelper.ExecuteReader(cmdtxt.ToString(), System.Data.CommandType.Text, pms.ToArray()))
{
if (dr.HasRows)
{
while(dr.Read() )
{
//tSId, tSName, tSGender?, tSAddress?, tSPhone?, tSAge?, tSBirthday?, tSCardId?, tsClassId?
TblStudentModel ts = new TblStudentModel();
//因为有些字段是可空的,所以要判断
ts.Id = dr.GetInt32(0);
ts.Name = dr.GetString(1);
ts.Gender = dr.IsDBNull(2) ?null : dr.GetString(2);//string是引用类型,null 可以这样
ts.Address = dr.IsDBNull(3) ? null : dr.GetString(3);
ts.Phone = dr.IsDBNull(4) ? null: dr.GetString(4);
ts.Age = dr.IsDBNull(5) ? null : (int?)dr.GetInt32(5);//因为int是值类型,这要这样转换下
DataList.Add(ts);
}
}
return DataList;
}
}
UI层:
//存放条件
List<TblStudentField> tiaojians = new List<TblStudentField>();
//字段列表tSId, tSName, tSGender, tSAddress, tSPhone, tSAge
//根据查询栏是否有值,来进行判断
if (txtId.Text.Length > 0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSId";
sf.Op = Operater.Eq;
sf.Value = txtId.Text.Trim();
tiaojians.Add(sf);
}
if (txtName.Text.Length>0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSName";
sf.Op = Operater.like;
sf.Value = txtName.Text.Trim();
tiaojians.Add(sf);
}
if (cboSex.Text.Length > 0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSGender";
sf.Op = Operater.Eq;
sf.Value = cboSex.SelectedItem.ToString();
tiaojians.Add(sf);
}
if (txtAddress.Text.Length > 0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSAddress";
sf.Op = Operater.like;
sf.Value = txtAddress.Text.Trim();
tiaojians.Add(sf);
}
if (txtPhone.Text.Length > 0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSPhone";
sf.Op = Operater.like;
sf.Value = txtPhone.Text.Trim();
tiaojians.Add(sf);
}
if (txtAge.Text.Length > 0)
{
TblStudentField sf = new TblStudentField();
sf.FieldName = "tSAge";
sf.Op = Operater.Eq;
sf.Value = txtAge.Text.Trim();
tiaojians.Add(sf);
}
TblStudentBll bll = new TblStudentBll();
//获取list集合
List<TblStudentModel> datalist = bll.GetDataList(tiaojians);
//将数据绑定到dataGridView中
dataGridView1.DataSource = datalist;
把要查询的条件放到一个集合里好处,是为了以后的扩展, 查询条件多了。只要把多添加的条件加到后面就好了。
项目文件列表: