前记:好吧好吧,我好好的自我检讨,这个总结拖了这么久才来写,而且一周多没有看技术相关的东西,实在罪过,不过因为想做的事情太多,所以时间的分配确实是一个很严肃的问题,不是时间不够用,是我自己没有做好时间管理,五一之后的分配重心又回归技术的学习,但是写小说、学英语也不能放下,所以时间安排就更重要了,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[];
sql_arr[] = cmbx_subject.Text;
sql_arr[] = cmbx_class.Text;
sql_arr[] = cmbx_grade.Text;
sql_arr[] = cmbx_difficulty.Text; //记录有几个搜索条件,根据不同的条件个数进行不同的拼接方法
int count = ;
for (int i = ; i < sql_arr.Length; i++)
{
if (sql_arr[i] == "")
{
continue;
}
count++;
}

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

//若搜索条件为1个,则根据数据在数组中存储位置的不同,对应不同的列,以i来记录下标判断需要加入的列名称是什么
for (int i = ; i < sql_arr.Length; i++)
{
if (sql_arr[i] == "")
{
continue;
}
//下标为0则对应subject列
if (i == )
{
sql_choose += "subject='" + subject + "'";
}
//下标为1则对应quesClass列
if (i == )
{
sql_choose += "quesClass='" + ques_class + "'";
}
//下标为2则对应grade列
if (i == )
{
sql_choose += "grade='" + grade + "'";
}
//下标为2则对应difficulty列
if (i == )
{
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 = ; string connStr = //连接数据库字符串,根据服务器的不同而不同;
//创建connection对象,用于连接数据库
SqlConnection conn = new SqlConnection(connStr);
//将数据库连接放入try,catch语句中,防止错误导致程序崩溃
try
{
//打开数据库连接
conn.Open();
//判断传递的sql语句的类型,若不为count类则进入if语句,否则进入else语句
if(sql_choose.IndexOf("count") == -)
{
//创建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[];
//是否存在数据
quesInfo[] = ques_result.Read() + "";
//获取当前数据的quesID值
quesInfo[] = ques_result.GetInt32() + "";
quesId = ques_result.GetInt32();
//获取当前数据的subject的值
quesInfo[] = ques_result.GetString();
//获取当前数据的quesContent的值
quesInfo[] = ques_result.GetString();
//是否展示在文本框中,默认为true
if (show)
{
//调用将数据展示在文本框中的函数showQues并把存有当前数据信息的quesInfo数组作为参数传递
showQues(quesInfo);
}
}
else
{
//因为没有查到数据,也需保存此信息
string[] quesInfo = new string[];
quesInfo[] = 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[].Trim()=="True")
{
//获取题目内容
string str_content = quesObj[];
//将当前显示的题目的id值赋给quesId
quesId = Convert.ToInt32( quesObj[]);
//判断题型是否为选择题,如果是则需进行处理,在选项最前面赋值(A.B.C.D)
if (quesObj[].Trim() == "选择题")
{
//在保存数据时,以字符@分隔开题目和每个选项
string[] arr_content = str_content.Split('@');
//每输出题目或一个选项则换行
rtxbx_show.Text = arr_content[] + "\n";
//在选项最前面赋值(A.B.C.D)
char chooseItem = 'A';
for (int i = ; i < arr_content.Length - ; i++)
{
rtxbx_show.Text += Convert.ToChar(chooseItem + i) + "." + arr_content[i + ] + "\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的值。

C#出题库项目的总结(2)的更多相关文章

  1. C#出题库项目的总结(1)

    前记: 截止18点05分(4月9号),完成了代码部分的编写,明天争取把文档完成,毕竟在这个上面花的时间太多了,还有单词和书需要背,好吧,不说废话啦,下面进入正题. (PS:因为学院的模拟招聘笔试出题和 ...

  2. Android 使用库项目时的一个特殊tip

    前提: 项目A作为库项目被项目B引用,但是项目A中有自定义的控件和自定义的属性,当在项目B中使用自定义的属性时,编译时就会直接报错:No resource identifier found for a ...

  3. Android中库项目、jar包等的使用方法

    在软件开发过程中,程序代码的复用,是非常重要的概念.我们总是需要使用一些现有的模块.包.框架,或开发自己的模块.包.框架,来实现对程序代码的复用.比如在JavaWeb编程过程中,经常使用的Struts ...

  4. Android Studio创建库项目及引用

    Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkS ...

  5. 使用 Flex 库项目---打包swc

    来源:http://help.adobe.com/zh_CN/flashbuilder/using/WSe4e4b720da9dedb5-1a92eab212e75b9d8b2-7ffe.html   ...

  6. Android 创建Library Project(库项目)与引用操作

    由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软 ...

  7. Github上比较流行的PHP扩展库项目

    这里列出比较常用的PHP开源扩展库项目: swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP.过去PHP只能做Web项目,现在有了Swoole.任意服务器端程序都可以用PHP来 ...

  8. Android库项目中的资源ID冲突

    1.前言 Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一个问题就是资源ID冲突,因为编译时SDK会自动帮我们处理这 ...

  9. Android 引用库项目,Debug 库项目

    转自:http://www.cnblogs.com/xitang/p/3615768.html#commentform 使用引用项目,无法追到源代码,无法Debug库项目The JAR of this ...

随机推荐

  1. Effective Java 34 Emulate extensible enums with interfaces

    Advantage Disadvantage Enum types Clarity Safety Ease of maintenance. None extensibility Typesafe en ...

  2. Effective Java 58 Use checked exceptions for recoverable conditions and runtime exceptions for programming errors

    Three kinds of throwables Throwables Checked Recoverable checked exceptions Y Y runtime exceptions N ...

  3. netty-socketio使用namespace

    一.简介 netty-socketio中的namespace可以用于区别在相同连接地址下的不同用户,当两个不同的用户打开同一个页面的时候,可以使用namespace用来标记不同用户.例如我们可以在用户 ...

  4. 续Gulp使用入门三步压缩CSS

    gulp 压缩css 一.安装 gulp-minify-css 模块 提示:你需要使用命令行的 cd 切换到对应目录后进行安装操作. 在命令行输入 npm install gulp-minify-cs ...

  5. GPS 坐标距离计算

    CREATE FUNCTION [dbo].[Rad]( @d float ) RETURNS float BEGIN return @d * PI()/ 180.00; End CREATE FUN ...

  6. private成员变量真的私有吗?(用指针刨他祖坟)

    今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢.于是做了这个实验.首先定义了一个类: class Test { private: int i; char c; int* p; public ...

  7. HDU 1695 GCD (莫比乌斯反演)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. Zbrush 4R7 P3中各类模型怎么快速隐藏

    在ZBrush®软件中除了遮罩功能可以对模型局部进行编辑外,我们还可以通过显示和隐藏来对模型的局部进行控制. 查看更多内容请直接前往:http://www.zbrushcn.com/jichu/xia ...

  9. 分享一个Fluent风格的邮件发送封装类

    C#中用SmtpClient发邮件很简单,闲着无事,简单封装一下 IEmailFactory public interface IEmailFactory { IEmailFactory SetHos ...

  10. UVALive 6263 The Dragon and the knights --统计,直线分平面

    题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分. 解法:计算每个骑士与每条直线的位置关系(上面还是下面) ...