C#机房重构——学生基本信息维护【组合查询】(面向过程的思想呈现不一样的机房重构,重点是思路和过程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whc888666/article/details/88037253
前言
机房收费系统的重构已经有一段时间了,目前已经做到了组合查询板块,总的来说还是很不错,学到了很多的东西。很多窗体都是按照自己的思路一步步的做出来的。虽然面向对象的思想还做的很不到位(封装、继承、多态)。这些都没有在程序中体现。我的主要目的在于能够先把思路理清楚。后面优化的时候再进行面向对象的思想。这样一来我可以非常的清楚两者之间的差异,二来可以非常清楚他们都是如何转化的。 今天我就来展示一下没有使用面向对象思想做出来的组合查询是什么样的。后面还会给大家展示面向对象思想的组合查询。
流程图

流程图是一切代码思路的来源。非常的重要。这也是我为什么每次都是把它放到最前面的原因。我的流程图是怎么画的,我的代码思路就是怎么走的。
组合查询其实不难,只要我们将每一步是如何实现的画出来,你就会明白,其实还是很简单的。非要说有点难的是:根据不同的字段出现不同的控件,这个也都是在实际操作中的难点。还有一点就是组合关系的判断:1.一个组合关系没有选择,说明就是查询第一行的内容;2.第一个组合关系的出现,表示查询的是第一行和第二行的关系;3.两个组合关系都用上了也就表示差窗体上所有的查询关系都要用上。
其实组合查询就这点东西。全在下面的流程图上(尽管很多地方还不是很专业,但是并不妨碍我对思考的记录)。
在这里插入图片描述

代码展示

UI层

对流程图阐释最清楚的地方就是我的UI层,尽管很多的判断不该放到这里,因为面向对象的的思想要求把逻辑判断需要放到BLL层。为了更加流畅的表现我的思路。当然后面优化的时候还是要严格按照面向对象的思想进行。代码的核心在于:if…else if 对逻辑的搭建。其他的一切都变得非常的简单。

namespace UI
{
    public partial class frmStudentInfoDefend : Form
    {
        public frmStudentInfoDefend()
        {
            InitializeComponent();
        }

        //封装一个方法
        public string English(string str)
        {
            switch (str)
            {
                case "卡号":
                    return "cardno";
                case "学号":
                    return "studentNo";
                case "姓名":
                    return "studentName";
                case "性别":
                    return "sex";
                case "专业":
                    return "department";
                case "年级":
                    return "grade";
                case "班级":
                    return "classno";
                default:
                    return "";
                                                          
            }
        }
        private void cmdQuery_Click(object sender, EventArgs e)
        {
            //实例化Model层
            StudentInfo studentinfo = new StudentInfo();

            //实例化Facade层
            fStudentInfoDefend fstudentinfodefend = new fStudentInfoDefend();

            //将UI层的数据传入Model层
            studentinfo.cmbName1 =English(cmbName1.Text.Trim());
            studentinfo.cmbName2 = English(cmbName2.Text.Trim());
            studentinfo.cmbName3 = English(cmbName3.Text.Trim());

            studentinfo.cmbOpert1 = cmbOpert1.Text.Trim();
            studentinfo.cmbOpert2 = cmbOpert2.Text.Trim();
            studentinfo.cmbOpert3 = cmbOpert3.Text.Trim();

            studentinfo.cmbGroupQuery1 = cmbGroupQuery1.Text.Trim();
            studentinfo.cmbGroupQuery2 = cmbGroupQuery2.Text.Trim();

            studentinfo.txtQueryContent1 = txtQueryContent1.Text.Trim();
            studentinfo.txtQueryContent2 = txtQueryContent2.Text.Trim();
            studentinfo.txtQueryContent3 = txtQueryContent3.Text.Trim();

            //接收DAL层的数据
            DataTable table = fstudentinfodefend.SelectStudentInfo(studentinfo);
            //组合两个控件都为空的情况
            if (cmbGroupQuery1.Text.Trim ()=="" && cmbGroupQuery2.Text.Trim()=="")
            {
                //设置其他控件不可用
                cmbName2.Enabled = false;
                cmbName3.Enabled = false;

                cmbOpert2.Enabled = false;
                cmbOpert3.Enabled = false;

                txtQueryContent2.Enabled = false;
                txtQueryContent3.Enabled = false;

                //判空
             if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || txtQueryContent1.Text.Trim() == "")
                {
                    MessageBox.Show("信息不能为空,请将信息填写完整!");
                    return;
                }
                else
                { 
                    dataGridView.DataSource = table;
                    MessageBox.Show("查询成功!", "提示");
                }
            }

            //组合控件2为空的情况
            else if (cmbGroupQuery2 .Text .Trim ()=="")
            {
                //判空
                DataTable tableGroup1 = fstudentinfodefend.SelectStuGroup1(studentinfo);
                if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || txtQueryContent1.Text.Trim() == ""|| cmbName2.Text.Trim() == "" || cmbOpert2.Text.Trim() == "" || txtQueryContent2.Text.Trim() == "")
                {
                    MessageBox.Show("信息不能为空,请将信息填写完整!");

                    //设置其他控件不可用
                    cmbName3.Enabled = false;
                    cmbOpert3.Enabled = false;
                    txtQueryContent3.Enabled = false;
                    return;
                }
                else
                {
                    dataGridView.DataSource = tableGroup1;
                    MessageBox.Show("查询成功!", "提示");
                }
            }

            //组合控件都不为空的情况
            else
            {
                DataTable tableGroup1And2 = fstudentinfodefend.SelectStuGroup1And2(studentinfo);
                //判空
                if (cmbName1.Text.Trim() == "" || cmbOpert1.Text.Trim() == "" || txtQueryContent1.Text.Trim() == "" || cmbName2.Text.Trim() == "" || cmbOpert2.Text.Trim() == "" || txtQueryContent2.Text.Trim() == ""||cmbName3.Text.Trim() == "" || cmbOpert3.Text.Trim() == "" || txtQueryContent3.Text.Trim() == "")
                {
                    MessageBox.Show("信息不能为空,请将信息填写完整!");
                    return;
                }
                else
                {
                    dataGridView.DataSource = tableGroup1And2;
                    MessageBox.Show("查询成功!", "提示");
                }
            }
        }

        private void frmStudentInfoDefend_Load(object sender, EventArgs e)
        {
            //查询条件
            cmbName1.Items.Add("卡号");
            cmbName1.Items.Add("学号");
            cmbName1.Items.Add("姓名");
            cmbName1.Items.Add("性别");
            cmbName1.Items.Add("专业");
            cmbName1.Items.Add("年级");
            cmbName1.Items.Add("班级");

            cmbName2.Items.Add("卡号");
            cmbName2.Items.Add("学号");
            cmbName2.Items.Add("姓名");
            cmbName2.Items.Add("性别");
            cmbName2.Items.Add("专业");
            cmbName2.Items.Add("年级");
            cmbName2.Items.Add("班级");

            cmbName3.Items.Add("卡号");
            cmbName3.Items.Add("学号");
            cmbName3.Items.Add("姓名");
            cmbName3.Items.Add("性别");
            cmbName3.Items.Add("专业");
            cmbName3.Items.Add("年级");
            cmbName3.Items.Add("班级");

            //操作符
            cmbOpert1.Items.Add(">");
            cmbOpert1.Items.Add("<");
            cmbOpert1.Items.Add("=");
            cmbOpert1.Items.Add("<>");

            cmbOpert2.Items.Add(">");
            cmbOpert2.Items.Add("<");
            cmbOpert2.Items.Add("=");
            cmbOpert2.Items.Add("<>");

            cmbOpert3.Items.Add(">");
            cmbOpert3.Items.Add("<");
            cmbOpert3.Items.Add("=");
            cmbOpert3.Items.Add("<>");

            //组合关系
            cmbGroupQuery1.Items.Add("与");
            cmbGroupQuery1.Items.Add("或");

            cmbGroupQuery2.Items.Add("与");
            cmbGroupQuery2.Items.Add("或");
        }

        private void cmdClear_Click(object sender, EventArgs e)
        {
            //清空控件
            cmbName1.Text= "";
            cmbName2.Text = "";
            cmbName3.Text = "";

            cmbOpert1.Text = "";
            cmbOpert2.Text = "";
            cmbOpert3.Text = "";

            txtQueryContent1.Text = "";
            txtQueryContent2.Text = "";
            txtQueryContent3.Text = "";

            cmbGroupQuery1.Text = "";
            cmbGroupQuery2.Text = "";
        }
    }
}

BLL层

面向对象的思想,这一层是非常关键的。因为很多的逻辑关系都在这层,由于我今天给大家展示的不是我面向对象思想的机房重构。所以该层的代码也就是失去了他原本的意义。因此在这里也就不展示该层的代码了。

DAL层

因为我没有用面向对象的思想写代码,势必导致我的DAL层跟人家的DAL完全不同。面向对象中是将该层的查询方法在数据库进行了存储过程处理。变得简单了很多。我的DAL还是费了我很大功夫的。但是一样达到了面向对象思想能够达到的效果。思路远比代码本身更加重要。

namespace DAL
{
    public class StudentInfoDefendDAO:IStudentInfoDefend
    {
        SqlHelper sqlhelper = new SqlHelper();
        public DataTable SelectStudentInfo(StudentInfo studentinfo)
        {
            string name =studentinfo.cmbName1;
            string fuhao = studentinfo.cmbOpert1;
            string text= studentinfo.txtQueryContent1;
            string addtext = name + fuhao + text;
            string sql = @"select * from [student_Info] where "+addtext+" ";
            DataTable table = sqlhelper.ExecuteQuery(sql, CommandType.Text);
            return table;
        }

        public DataTable SelectStuGroup1(StudentInfo studentinfo)
        {
            string nameGroup1 = studentinfo.cmbName1;
            string fuhaoGroup1 = studentinfo.cmbOpert1;
            string textGroup1 = studentinfo.txtQueryContent1;
            string addtextGroup1 = nameGroup1 + fuhaoGroup1 + textGroup1;
            string sql = @"select * from [student_Info] where " + addtextGroup1 + " ";
            DataTable tableGroup1 = sqlhelper.ExecuteQuery(sql, CommandType.Text);
            return tableGroup1;
        }

        public DataTable SelectStuGroup1And2(StudentInfo studentinfo)
        {
            string nameGroup1And2 = studentinfo.cmbName1;
            string fuhaoGroup1And2 = studentinfo.cmbOpert1;
            string textGroup1And2 = studentinfo.txtQueryContent1;
            string addtextGroup1And2 = nameGroup1And2 + fuhaoGroup1And2 + textGroup1And2;
            string sql = @"select * from [student_Info] where " + addtextGroup1And2 + " ";
            DataTable tableGroup1And2 = sqlhelper.ExecuteQuery(sql, CommandType.Text);
            return tableGroup1And2;
        }
    }
}
总结
其实组合查询就是这么的简单,机房收费系统一共有三个窗体都是组合查询。我会用不同的思想和方法来做一遍,今天展示给大家的可以说是面向过程的组合查询。后面会展示面向对象思想的组合查询,到时候看看他们之间都有些什么不同。

当然还希望大佬给我指出我的不足,我深表感激。

猜你喜欢

转载自blog.csdn.net/whc888666/article/details/88037253
今日推荐