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[];
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)的更多相关文章
- C#出题库项目的总结(1)
前记: 截止18点05分(4月9号),完成了代码部分的编写,明天争取把文档完成,毕竟在这个上面花的时间太多了,还有单词和书需要背,好吧,不说废话啦,下面进入正题. (PS:因为学院的模拟招聘笔试出题和 ...
- Android 使用库项目时的一个特殊tip
前提: 项目A作为库项目被项目B引用,但是项目A中有自定义的控件和自定义的属性,当在项目B中使用自定义的属性时,编译时就会直接报错:No resource identifier found for a ...
- Android中库项目、jar包等的使用方法
在软件开发过程中,程序代码的复用,是非常重要的概念.我们总是需要使用一些现有的模块.包.框架,或开发自己的模块.包.框架,来实现对程序代码的复用.比如在JavaWeb编程过程中,经常使用的Struts ...
- Android Studio创建库项目及引用
Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkS ...
- 使用 Flex 库项目---打包swc
来源:http://help.adobe.com/zh_CN/flashbuilder/using/WSe4e4b720da9dedb5-1a92eab212e75b9d8b2-7ffe.html ...
- Android 创建Library Project(库项目)与引用操作
由于在开发过程,为了实现未曾了解的某种效果与特定功能,而求助于网上优秀的开源项目,在使用过程中发现引用开源的Library Project(库项目),的确可以解决很多问题,而且也给出了一种思路,好的软 ...
- Github上比较流行的PHP扩展库项目
这里列出比较常用的PHP开源扩展库项目: swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP.过去PHP只能做Web项目,现在有了Swoole.任意服务器端程序都可以用PHP来 ...
- Android库项目中的资源ID冲突
1.前言 Android Studio对模块化开发提供的一个很有用的功能就是可以在主项目下新建库项目(Module),但是在使用库项目时却有一个问题就是资源ID冲突,因为编译时SDK会自动帮我们处理这 ...
- Android 引用库项目,Debug 库项目
转自:http://www.cnblogs.com/xitang/p/3615768.html#commentform 使用引用项目,无法追到源代码,无法Debug库项目The JAR of this ...
随机推荐
- 【CSharp】C#开发ActiveX插件
这几天Web项目中需要用到ActiveX插件(PS:听说这个是好久好久的东西了...),由于项目中需要调用本地资源所以只能研究研究这位老兄了. 先说说自己学习他的经历,开始的时候是用百度引擎检索自己所 ...
- PHP模拟发送POST请求之四、加强file_get_contents()发送POST请求
使用了笨重fsockopen()方法后,我们开始在PHP函数库里寻找更简单的方式来进行POST请求,这时,我们发现了PHP的文件函数也具有与远程URL交互的功能. 最简单的是fopen()和fread ...
- 读书笔记——Windows环境下32位汇编语言程序设计(13)关于EXCEPTION_DEBUG_INFO结构体
在动手自己尝试编写书上第13章的例子Patch3时,遇到了一个结构体EXCEPTION_DEBUG_INFO. 这个结构体在MASM的windows.inc中的定义和MSDN中的定义不一样. (我使用 ...
- java工程中的相关路径
一.路径 绝对路径: 指的是文件在系统中的真实路径(物理路径). 相对路径: 指的是文件相对某个目录的相对路径. 对于java application 工程来说,当编写完一个类之后,class文件会编 ...
- poj 3694 Network 边双连通+LCA
题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...
- jquery parent和parents,children和find
parent返回匹配元素的父元素的元素集合:parents返回匹配元素的祖先元素的元素集合. children返回匹配元素的子元素的元素集合:find返回匹配元素的后代元素的元素集合.
- Swift学习笔记--变量与常量
1.Swift是一门强类型语言,不能为变量赋予其自身数据类型之外的值: 2.声明变量使用var关键字,声明常量使用let关键字: 3.声明变量或常量时没有对其指定类型且赋予了初值,则编译器会自动推断常 ...
- 字符设备驱动——memory编译问题及解决办法
1.fatal error:asm/system.h:No such file or directory #include <linux/version.h> #if LINUX_VERS ...
- 基于元数据的ETL系统
从努力到选择 从实现到设计 从部分到整体 以下是我对DW design的一些想法 下次使用C#来实现一下 ETL中Source 的信息 数据提供形式:DB(ORACLE SQLSE ...
- 教你一招 - Misc类型插件的妙用(附带插件源码)
熟悉nopcommerce插件的朋友应该知道里面有一种Misc类型的插件,比如Nop.Plugin.Misc.WebServices和 Nop.Plugin.Misc.FacebookShop,继承自 ...