利用SqlBulkCopy实现网上答题系统_第1页
利用SqlBulkCopy实现网上答题系统_第2页
利用SqlBulkCopy实现网上答题系统_第3页
利用SqlBulkCopy实现网上答题系统_第4页
利用SqlBulkCopy实现网上答题系统_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、利用SqlBulkCopy实现网上答题系统    利用SqlBulkCopy实现网上答题系统正文:本文利用.Net 2.0引入的SqlBulkCopy新类结合SQL Server2005实现网上答题系统。介绍一种把其它数据源的数据批量加载到SQL Server表的高效方法,并确保其插入数据的完整性,一致性。 关键字.Net 2.0,C#,SqlBulkCopy,批量加载 一、前言问卷调查是获取用户信息最有效途径之一,不管是企业单位,还是政府部门都广泛采用。利用网上这种途径来收集信息,可以节省大量的人力和物力。而同样有奖问题、网上考试也被各个企业

2、单位广泛应用。其实现方式都可以通过网上答题系统来实现。网上答题的题型主要有单项选择题,多项选择题和判断题。以往网上答题系统的实现方式是程序收集用户回答的答题信息,通过编写事务,把答题信息逐条的写入数据库。这样主要有两个问题。一是需要开发人员自己写事务来处理把答题信息插入数据库。如果处理不好会使收集的答题信息不完整,给开发人员带来不少的麻烦和开发难度。另外就是程序效率比较低下,特别是在题量比较大的情况下。通过.Net 2.0引入的SqlBulkCopy新类可以有效的解决这些问题。本文结合笔者的开发和应用实践,详细介绍利用SqlBulkCopy实现网上答题系统的原理和关键步骤。二、SqlBulkC

3、opy介绍三、数据库设计1、数据表设计打开SQL Server2005,建立数据表tUser和tAnswer,分别是用户信息表和答题表。具体数据库关系和字段如图1所示:图1 数据表及关系图具体思路是:用户根据答题内容回答完题,并填写完用户的个人信息。程序首先收集这些数据,并向用户信息表插入用户信息,返回该用户的编号(即UserID)。再根据用户编号生成内存表DataTable,利用SqlBulkCopy把内存表中数据批量的插入答题表。由数据提交的情况向用户返回成功或失败的消息。2、存储过程设计新增一个存储过程AddNewUser,完成根据姓名、电话和身份证号向用户信息表插入用户信息,返回自增量

4、字段生成的用户ID号功能,具体代码如下:CREATE PROCEDURE dbo.AddNewUserfUserName varchar(50),fPhone varchar(100),fIDCard varchar(50),fUserID int output传出参数ASbegin tranSET NOCOUNT ON;insert into tUser (fUserName,fPhone,fIDCard)values(fUserName,fPhone,fIDCard);set fUserID=(SELECT identity);-返回用户ID号if error!=0rollbackelse

5、commit四、程序实现 根据图2制作网页,其中单项选择题和判断题使用RadioButtonList服务器控件,多项选择题使用CheckBoxList服务器控件。设置好各服务器控件的属性,题所使用控件的命名采用“题型序号”的命名方式,如选择题第一题命名为:a1。图2 程序界面图随后添加“提交答卷”按钮的单击事件,核心代码如下: protected void Button1_Click(object sender, EventArgs e) /构建内存答题表dt,用来存放获取的答题信息 DataTable dt = new DataTable(); int UserID = 0; int Que

6、stionID = 0; string Answer = string.Empty; /采用遍历获取数据 foreach (Control ctl in form1.Controls) /获取单选题、判断题的答题数据 if (ctl is RadioButtonList) Answer = (RadioButtonList)ctl).SelectedValue;/把数据添加到构建的内存答题表dt中 AddRow(ref dt, UserID, QuestionID, Answer); if (ctl is CheckBoxList) /获取多选题的答题数据 Answer = string.Em

7、pty; CheckBoxList cbl = (CheckBoxList)ctl; if (cbl.Itemsi.Selected) Answer += cbl.Itemsi.Value; AddRow(ref dt, UserID, QuestionID, Answer); /获取用户信息 string UserName = txtUserName.Text; string Phone = txtPhone.Text; string IDCard = txtIDCard.Text; try string spName = "AddNewUser"/省略部分是根据存储过程

8、得到UserID /更新内存答题表dt信息 foreach (DataRow dr in dt.Rows) dr"UserID" = UserID; /通过SqlBulkCopy把内存答题表数据更新到Sql Server数据库中 SqlBulkCopyData(dt); Label1.Text="提交答卷成功! " catch Label1.Text="系统错误,请和系统管理员联系! " 程序先在内存中构建用来存放答题信息的答题表dt,随后采用遍历的方式获取答题的数据,并通过AddRow()函数把获取的数据保存在构建的dt表中。Add

9、Row()函数代码如下:protected void AddRow(ref DataTable dt, int UserID, int QuestionID, string Answer) DataRow dr = dt.NewRow(); dr"UserID" = UserID; dr"QuestionID" = QuestionID; dr"Answer" = Answer; 根据获取的答题数据调用存储过程AddNewUser保存用户信息,返回用户编号。更新答题表信息,通过SqlBulkCopy把答题表的数据批量加载到SQL Se

10、rver数据库中,加载数据的代码如下: protected void SqlBulkCopyData(DataTable dt) /使用SqlBulkCopy把内存表DataTable里的数据插入答卷数据表 SqlBulkCopy bcp = new SqlBulkCopy(connectionString);/指定目标数据库的表名 bcp.DestinationTableName = "tAnswer" /建立数据源表字段和目标表中的列之间的映射 SqlBulkCopyColumnMapping MapUserID = new SqlBulkCopyColumnMappi

11、ng(); MapUserID.DestinationColumn = "fUserID" MapUserID.SourceColumn = "UserID" SqlBulkCopyColumnMapping MapQID = new SqlBulkCopyColumnMapping(); MapQID.DestinationColumn = "fQuestionID" MapQID.SourceColumn = "QuestionID" SqlBulkCopyColumnMapping MapAnswer = n

12、ew SqlBulkCopyColumnMapping(); MapAnswer.DestinationColumn = "fAnswer" MapAnswer.SourceColumn = "Answer" /写入数据库表 bcp.WriteToServer(dt); bcp.Close(); SqlBulkCopy 包含一个方法 WriteToServer,它用来从数据的源复制数据到数据的目的地。WriteToServer方法可以处理的数据类型有DataRow数组、DataTable 和 DataReader。根据实际情况,我们选用DataTable

13、。程序先根据连接目标数据库的连接字符串生成SqlBulkCopy 实例,并指定DestinationTableName属性,也就是目标数据库的表名。再通过SqlBulkCopyColumnMapping类,设置数据源字段到目标数据表字段的映射。也就是说如果目标数据和源数据的列名不同时,可以用这个类进行映射。最后通过WriteToServer把数据加载到数据库中。如果目标表中的数据量比较大,需要设置SqlBulkCopy的BatchSize,使加载数据分批进行,在每一批次结束时,就将该批次中的行发送到数据库。根据程序运行情况,给用户返回答卷提交结果。五、结束语以上程序在VS2005(C#),SQL Server 2005, Windows 2003 SP1环境下编译调试通过。利用.NET 2.0引入的SqlBulkCopy新类,实现对SQL Server数据库的批量加载。这种技术在实际开发项目网上答题系统中得到了充分利

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论