zoukankan      html  css  js  c++  java
  • C#出题库项目的总结(2)

    前记:好吧好吧,我好好的自我检讨,这个总结拖了这么久才来写,而且一周多没有看技术相关的东西,实在罪过,不过因为想做的事情太多,所以时间的分配确实是一个很严肃的问题,不是时间不够用,是我自己没有做好时间管理,五一之后的分配重心又回归技术的学习,但是写小说、学英语也不能放下,所以时间安排就更重要了,anyway,干巴爹!

    正文:

    进入mainForm窗体后

    (1)如果不选择查询条件则点击查询按钮,则有MessageBox提示“请选择条件再搜索”;如果直接点击上一题或下一题按钮,则有MessageBox提示“请确定搜索的条件”。

    (2)选择下拉菜单来改变查询条件,而当下拉菜单的值改变时,显示查询题目信息的label会被置空,文本框的显示内容会改变为”请点击查询按钮进行搜索...“,点击上一题、下一题的MessageBox提示内容也会改变为”请确定搜索的条件“。

    //另外三个下拉菜单的SelectedIndexChanged事件都同科目下拉菜单类似
    private
    void cmbx_subject_SelectedIndexChanged(object sender, EventArgs e) {     //如果改变了下拉菜单的值,则表示查询条件变化,需要将文本框的值改变,且根据文本框中的值,上一题和下一题按钮将会有不同的提示   rtxbx_show.Text = "请点击查询按钮进行搜索...";   lbl_showNum.Text = ""; }

    (3)选择查询条件,点击查询按钮

    a.没有查询到符合条件的题目(查询相关的数据库连接等代码在“b.查询到符合条件的题目”中讲述,这里只说相关的显示及提示信息)

      文本框显示内容变为“没有找到对应题目”,上一题、下一题MessageBox提示内容变为“请换一个条件再查找吧”。

    b.查询到符合条件的题目

       1)点击查询按钮,判断是否查询条件(下拉菜单的值)全为空,若为空则有MessageBox提示“请选择条件再搜索”;若不为空则调用jointSQLShow()函数。

    //此函数用于拼接 展示 的SQL字符串
    string
    jointSQLShow() { //sql语句相同部分的初始化 string sql_choose = "select * from [questions] where "; //调用jointSQL函数将sql语句拼接 sql_choose += jointSQL(); //返回的拼接好的sql语句,sql语句的拼接 return sql_choose;
    }

      2)jointSQL函数

      a)先定义一个数组sql_arr用于保存下拉菜单选中的值,再定义一个count用于记录有几个条件。

    //声明一个数组保存搜索条件(即获取到的下拉菜单的值)
    string[] sql_arr = new string[4];
    sql_arr[0] = cmbx_subject.Text;
    sql_arr[1] = cmbx_class.Text;
    sql_arr[2] = cmbx_grade.Text;
    sql_arr[3] = cmbx_difficulty.Text;
    
    //记录有几个搜索条件,根据不同的条件个数进行不同的拼接方法
    int count = 0;
    for (int i = 0; i < sql_arr.Length; i++)
    {
           if (sql_arr[i] == "")
           {
                 continue;
            }
            count++;
    }

      b)根据count值的不同,对应不同的拼接方式

    //若搜索条件为1个,则根据数据在数组中存储位置的不同,对应不同的列,以i来记录下标判断需要加入的列名称是什么
    for (int i = 0; i < sql_arr.Length; i++) { if (sql_arr[i] == "") { continue; } //下标为0则对应subject列 if (i == 0) { sql_choose += "subject='" + subject + "'"; } //下标为1则对应quesClass列 if (i == 1) { sql_choose += "quesClass='" + ques_class + "'"; } //下标为2则对应grade列 if (i == 2) { sql_choose += "grade='" + grade + "'"; } //下标为2则对应difficulty列 if (i == 3) { sql_choose += "difficulty='" + difficulty + "'"; } }
    //count值为2或3时,需在第二或第三个条件前加“and”连接,拼接的部分与count=1时相同,只是需要多一个判断,即当前的条件是不是第一个条件
    //count值为4时,即所有条件都有
    sql_choose += "subject='" +sql_arr[0]+ "' and quesClass='" +sql_arr[1]+ "' and grade='" +sql_arr[2]+ "' and difficulty='" +sql_arr[3]+ "'";

      3)将调用jointSQLShow()的值作为实参传入contactData()中

      contactData函数

    int contactData(string sql_choose,bool show = true);
    //用于此函数返回值,根据传递的sql语句的不同而不同
    //若sql语句为计数则返回计数的结果,否则返回0
    int cou = 0;
    
    string connStr = //连接数据库字符串,根据服务器的不同而不同;
    //创建connection对象,用于连接数据库
    SqlConnection conn = new SqlConnection(connStr);
    //将数据库连接放入try,catch语句中,防止错误导致程序崩溃
    try
    {
            //打开数据库连接
            conn.Open();
            //判断传递的sql语句的类型,若不为count类则进入if语句,否则进入else语句
            if(sql_choose.IndexOf("count") == -1)
            {
                        //创建comm对象传递sql命令
                        SqlCommand comm = new SqlCommand(sql_choose, conn);
                        //将从数据库获得的值保存在SqlDataReader中
                        SqlDataReader ques_result = comm.ExecuteReader();
                        //如果当前指向的数据存在则进入if,否则进入else
                        if (ques_result.HasRows)
                        {
                            //quesObj[0]=Reader(),quesObj[1]=quesID
                            //quesObj[2]=quesClass,quesObj[3]=quesContent
                            string[] quesInfo = new string[4];
                            //是否存在数据
                            quesInfo[0] = ques_result.Read() + "";
                            //获取当前数据的quesID值
                            quesInfo[1] = ques_result.GetInt32(0) + "";
                            quesId = ques_result.GetInt32(0);
                            //获取当前数据的subject的值
                            quesInfo[2] = ques_result.GetString(2);
                            //获取当前数据的quesContent的值
                            quesInfo[3] = ques_result.GetString(5);
                            //是否展示在文本框中,默认为true
                            if (show)
                            {
                                //调用将数据展示在文本框中的函数showQues并把存有当前数据信息的quesInfo数组作为参数传递
                                showQues(quesInfo);
                            }
                         }
                         else
                         {
                                //因为没有查到数据,也需保存此信息
                                string[] quesInfo = new string[1];
                                quesInfo[0] = ques_result.Read() + "";
                                if (show)
                                {
                                    showQues(quesInfo);
                                }
                        }
                        //关闭reader对象
                        ques_result.Close();
                   }
                   else
                   {
                        //执行计数(count)sql语句,改变cou的值
                        SqlCommand comm = new SqlCommand(sql_choose, conn);
                        cou = (int)comm.ExecuteScalar();
                   }
    }
    //若数据库连接出现错误,则进入catch语句,并将错误提示
    catch (Exception ex)
    {
           //打开发生异常的处理
                    MessageBox.Show("出现错误:" + ex);
    }
    //不论执行try或catch最终都执行finally语句,将数据库连接关闭
    finally
    {
            //关闭数据库的连接
            conn.Close();
    }
    //返回cou的值
    return cou;

      a>若数据库出错则会进入catch代码部分,将错误提示在MessageBox里。

      b>定义的int cou是用于SQL语句是为了计算符合条件的题目数目。用indexOf("count")则能判断传入的SQL语句的类型,若SQL语句不是为了计数,则cou一直为初始值0;若为了计数则会进入最外层的else,执行SQL语句并将结果保存在cou中,作为contactData的值返回。

      c>若indexOf("count")为-1则传入的SQL语句为了查询题目。定义一个SqlDataReader对象用于查询数据库中的题目。若数据库中有对应SQL语句的数据,则进入内层的if语句,若没有则进入内层的else语句。contactData的第二个参数默认为true,即将查询到的数据显示在文本框中,若show为true则调用showQues函数,并将查询到的当前的题目的相关信息放到定义的quesInfo数组中作为参数传递到showQues函数中。

      showQues函数

    void showQues(string[] quesObj)//数组参数存储的值:quesObj[0]=Reader(),quesObj[1]=quesID,quesObj[2]=quesClass,quesObj[3]=quesContent
    {
                //是否有数据存在
                if (quesObj[0].Trim()=="True")
                {
                    //获取题目内容
                    string str_content = quesObj[3];
                    //将当前显示的题目的id值赋给quesId
                    quesId = Convert.ToInt32( quesObj[1]);
                    //判断题型是否为选择题,如果是则需进行处理,在选项最前面赋值(A.B.C.D)
                    if (quesObj[2].Trim() == "选择题")
                    {
                        //在保存数据时,以字符@分隔开题目和每个选项
                        string[] arr_content = str_content.Split('@');
                        //每输出题目或一个选项则换行
                        rtxbx_show.Text = arr_content[0] + "\n";
                        //在选项最前面赋值(A.B.C.D)
                        char chooseItem = 'A';
                        for (int i = 0; i < arr_content.Length - 1; i++)
                        {
                            rtxbx_show.Text += Convert.ToChar(chooseItem + i) + "." + arr_content[i + 1] + "\n";
                        }
                    }
                    else
                    {
                        //如不为选择题则直接输出到文本框
                        rtxbx_show.Text = str_content + "\n";
                    }
                }
                else
                {
                    //数据库中没有符合条件的数据
                    rtxbx_show.Text = "没有找到对应题目";
                }
    
    }

      4)调用jointSQLCount()函数拼接计数的SQL语句,并将其作为参数传入contactData函数中,contactData函数返回符合查询条件的题目的总个数。

      jointSQLCount函数

    string jointSQLCount()
    {
                //sql语句相同部分的初始化
                string sql_choose = "select count(*) from [questions] where ";
                //调用jointSQL函数将sql语句拼接
                sql_choose += jointSQL();
                return sql_choose;
    }

      5)若返回的题目总个数不为0,则定义一个数组ques_arr该数组长度的长度为quesNum,用于保存符合条件题目的quesId值。

      6)改变label的值,"查询题目总数为【" + quesNum + "】个/当前为第【" + currentNum + "】个";

    c.点击下一题或上一题按钮(两个按钮功能类似,只是改变判断数组边界的条件,在此只讲下一题的代码)

      1)判断currentNum是否小于ques_arr.Length,若不小于,则提示“没有下一题了”

      2)若小于,则ques_arr中下一个quesId取出作为参数传入jointSQLId函数中,并改变label的值。

  • 相关阅读:
    DWZ集成的xhEditor编辑器浏览本地图片上传的设置
    微服务看门神-Zuul
    OAuth2.0最简向导
    打造个人IP: 开源项目网站构建框架
    提前体验让人"回归Windows怀抱"的Windows Terminal
    ToB蓝海的台阶-PaaS,SaaS技术详解
    再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署
    Netty实现高性能IOT服务器(Groza)之精尽代码篇中
    使用keepalived做High Available(HA)
    Nginx 常用配置方式说明
  • 原文地址:https://www.cnblogs.com/zllwebstudy/p/5446056.html
Copyright © 2011-2022 走看看