经过我的不懈努力,机房重构终于快完成的差不多了。这一次的组合查询我用了最基本的知识强行弄了出来,虽然功能实现了,也有一定的健壮性,不会报任何错误,但是我还是觉得和其他人用的设计模式设计出来的不能相提并论。所以我们学习软件工程学,一定要活到老学到老,不能闭门造车,要有开放的思想,要坚持向他人学习。
那么就让我来介绍自己简陋的方法吧,存在着很多问题也请大家指出来。
我认为改变是一个过程,所以我还是延续了第一次机房时候的设计,查询的风格也是和以前一样,这样下面几个组合查询的窗体就可以看到我的变化了。
if (cmb1.Text == "" || cmb11.Text == "" || txt1.Text.Trim() == "")
{
MessageBox.Show("请把第一条查询条件补齐");
}
else if (cmb111.Text != "" &&(cmb2.Text ==""||cmb22.Text ==""||txt2.Text.Trim() ==""))
{
MessageBox.Show("请把第二条查询条件补齐");
}
else if (cmb222.Text != "" &&(cmb3.Text == "" || cmb33.Text == "" || txt3.Text.Trim() == ""))
{
MessageBox.Show("请把第三条查询条件补齐");
}
else
{
//开始查询
}
命名不是很规范,请见谅。这是我的判定逻辑,如果第一个查询条件有空,那么提示补齐第一个条件,如果第一个组合按钮(与和或)不为空,且第二个查询条件有空,提示补齐第二个条件,如果第二个组合按钮(与和或)不为空,且第三个查询条件有空,提示补齐第三个条件,这样的逻辑,就可以提示所有不全的情况。
public string toName(string i)
{
switch(i)
{
case"卡号":
return "cardno";
case"学号":
return "studentNo";
case "姓名":
return "studentName";
case "性别":
return "sex";
case "系别":
return "department";
case "年级":
return "grade";
case "备注":
return "remark";
case">":
return ">";
case "<":
return "<";
case "=":
return "=";
case "<>":
return "!=";
case "与":
return " and ";
case "或":
return " or ";
default:
return "";
}
首先,我定义了一个方法,这个方法可以把从控件接受到的中文转化为数据库中可以识别的字符串。
string v = "'";
string a = toName(cmb1.Text);
string aa = toName(cmb11.Text);
string aaa =txt1.Text;
string b = toName(cmb2.Text);
string bb = toName(cmb22.Text);
string bbb = txt2.Text;
string c = toName(cmb3.Text);
string cc = toName(cmb33.Text);
string ccc = txt3.Text;
string tiaojian1 = toName(cmb111.Text);
string tiaojian2 = toName(cmb222.Text);
string s = "Select * FROM Student_Info WHERE ";
然后我定义了一堆的字符串来接受从空间里接受到的信息,并且通过toName的方法转化字符串,并且用这些字符串就可以拼接成为数据库可以识别的数据库查询语句。
Student_Info student = new Student_Info();
BasicManageFacade facade = new BasicManageFacade();
创建一个外观层和一个学生表,常规操作。
private string sqlyuju;
public string Sqlyuju
{
get { return sqlyuju; }
set { sqlyuju = value; }
}
在ENTITY层的student_info设置一个这样的属性。
if (cmb111.Text == "")
{
string sql = s+a+aa+v+aaa+v;
student.Sqlyuju = sql;
DataTable dt = new DataTable();
dt = facade.BasicManage1(student);
if (dt.Rows.Count == 0)
{
MessageBox.Show("没有信息");
}
else
{
dataGridView1.DataSource = dt;
}
}
else if (cmb222.Text == "")
{
string sql = s+a+aa+v+aaa+v+tiaojian1+b+bb+v+bbb+v;
student.Sqlyuju = sql;
DataTable dt = new DataTable();
dt = facade.BasicManage1(student);
dataGridView1.DataSource = dt;
if (dt.Rows.Count == 0)
{
MessageBox.Show("没有信息");
}
else
{
dataGridView1.DataSource = dt;
}
}
else
{
string sql=s+a+aa+v+aaa+v+tiaojian1+b+bb+v+bbb+v+tiaojian2+c+cc+v+ccc+v;
student.Sqlyuju = sql;
DataTable dt = new DataTable();
dt = facade.BasicManage1(student);
dataGridView1.DataSource = dt;
if (dt.Rows.Count == 0)
{
MessageBox.Show("没有信息");
}
else
{
dataGridView1.DataSource = dt;
}
}
这串代码就是代替第二张图片里面的“//开始查询”的内容,它的逻辑就是假如第一个组合按钮(选择或和与的按钮)假如为空,那么定义一个字符串sql,sql就是第四张图片里面的字符串拼接而成,然后把sql传递给之前我们新建的student的sqlyuju属性,新建dt, dt = facade.BasicManage1(student);dataGridView1.DataSource = dt;然后判定是否查到内容,没查到提示,查到显示到datagridview控件中。假如第二个组合按钮为空,那么定义字符串拼接成两个条件的SQL语句,否则凭借成为三个条件的SQL语句。
public class BasicManageDAL : BasicManageIDAL
{
public DataTable BasicManage1(Student_Info student)
{
SQLHelper sqlHelper = new SQLHelper();
string sql = student.Sqlyuju;
DataTable dt = sqlHelper.ExecuteQuery(sql, CommandType.Text);//查询不返回参数,没有SQLParameter
return dt;
}
}
这就是DAL层的代码,我写的代码基本所有的事情都在U层干了,其他层就是负责信息的传来传去,我都觉着没有必要写出来了。虽然很简单,但是我感觉有点和七层登陆的思想背道而驰了,但是我觉着这种尝试的经历也并不是什么坏处,至少锻炼了我独自思考问题的能力,让我对自己更加有信息,当马上发现了自己的问题以后,就可以让自己通过对比,更容易发现自己的问题所在。