下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、利用SqlBulkCopy實(shí)現(xiàn)網(wǎng)上答題系統(tǒng) 利用SqlBulkCopy實(shí)現(xiàn)網(wǎng)上答題系統(tǒng)正文:本文利用.Net 2.0引入的SqlBulkCopy新類結(jié)合SQL Server2005實(shí)現(xiàn)網(wǎng)上答題系統(tǒng)。介紹一種把其它數(shù)據(jù)源的數(shù)據(jù)批量加載到SQL Server表的高效方法,并確保其插入數(shù)據(jù)的完整性,一致性。 關(guān)鍵字.Net 2.0,C#,SqlBulkCopy,批量加載 一、前言問(wèn)卷調(diào)查是獲取用戶信息最有效途徑之一,不管是企業(yè)單位,還是政府部門都廣泛采用。利用網(wǎng)上這種途徑來(lái)收集信息,可以節(jié)省大量的人力和物力。而同樣有獎(jiǎng)問(wèn)題、網(wǎng)上考試也被各個(gè)企業(yè)
2、單位廣泛應(yīng)用。其實(shí)現(xiàn)方式都可以通過(guò)網(wǎng)上答題系統(tǒng)來(lái)實(shí)現(xiàn)。網(wǎng)上答題的題型主要有單項(xiàng)選擇題,多項(xiàng)選擇題和判斷題。以往網(wǎng)上答題系統(tǒng)的實(shí)現(xiàn)方式是程序收集用戶回答的答題信息,通過(guò)編寫(xiě)事務(wù),把答題信息逐條的寫(xiě)入數(shù)據(jù)庫(kù)。這樣主要有兩個(gè)問(wèn)題。一是需要開(kāi)發(fā)人員自己寫(xiě)事務(wù)來(lái)處理把答題信息插入數(shù)據(jù)庫(kù)。如果處理不好會(huì)使收集的答題信息不完整,給開(kāi)發(fā)人員帶來(lái)不少的麻煩和開(kāi)發(fā)難度。另外就是程序效率比較低下,特別是在題量比較大的情況下。通過(guò).Net 2.0引入的SqlBulkCopy新類可以有效的解決這些問(wèn)題。本文結(jié)合筆者的開(kāi)發(fā)和應(yīng)用實(shí)踐,詳細(xì)介紹利用SqlBulkCopy實(shí)現(xiàn)網(wǎng)上答題系統(tǒng)的原理和關(guān)鍵步驟。二、SqlBulkC
3、opy介紹SqlBulkCopy是.NET Framework 2.0新增的類,位于命名空間System.Data.SqlClient下,主要提供把其它數(shù)據(jù)源的數(shù)據(jù)有效批量的加載到SQL Server表中的功能。類似與 Microsoft SQL Server 包中名為 bcp 的命令行應(yīng)用程序。但是使用 SqlBulkCopy 類可以編寫(xiě)托管代碼解決方案,性能上優(yōu)于bcp命令行應(yīng)用程序,更優(yōu)于如Insert方式向SQL Server表加載大量數(shù)據(jù)。SqlBulkCopy可以應(yīng)用到大批量數(shù)據(jù)的轉(zhuǎn)移上,而不管數(shù)據(jù)源是什么。三、數(shù)據(jù)庫(kù)設(shè)計(jì)1、數(shù)據(jù)表設(shè)計(jì)打開(kāi)SQL Server2005,建立數(shù)據(jù)表t
4、User和tAnswer,分別是用戶信息表和答題表。具體數(shù)據(jù)庫(kù)關(guān)系和字段如圖1所示:圖1 數(shù)據(jù)表及關(guān)系圖具體思路是:用戶根據(jù)答題內(nèi)容回答完題,并填寫(xiě)完用戶的個(gè)人信息。程序首先收集這些數(shù)據(jù),并向用戶信息表插入用戶信息,返回該用戶的編號(hào)(即UserID)。再根據(jù)用戶編號(hào)生成內(nèi)存表DataTable,利用SqlBulkCopy把內(nèi)存表中數(shù)據(jù)批量的插入答題表。由數(shù)據(jù)提交的情況向用戶返回成功或失敗的消息。2、存儲(chǔ)過(guò)程設(shè)計(jì)新增一個(gè)存儲(chǔ)過(guò)程AddNewUser,完成根據(jù)姓名、電話和身份證號(hào)向用戶信息表插入用戶信息,返回自增量字段生成的用戶ID號(hào)功能,具體代碼如下:CREATE PROCEDURE dbo.A
5、ddNewUserfUserName varchar(50),fPhone varchar(100),fIDCard varchar(50),fUserID int output傳出參數(shù)ASbegin tranSET NOCOUNT ON;insert into tUser (fUserName,fPhone,fIDCard)values(fUserName,fPhone,fIDCard);set fUserID=(SELECT identity);-返回用戶ID號(hào)if error!=0rollbackelsecommit四、程序?qū)崿F(xiàn) 根據(jù)圖2制作網(wǎng)頁(yè),其中單項(xiàng)選擇題和判斷題使用RadioBu
6、ttonList服務(wù)器控件,多項(xiàng)選擇題使用CheckBoxList服務(wù)器控件。設(shè)置好各服務(wù)器控件的屬性,題所使用控件的命名采用“題型序號(hào)”的命名方式,如選擇題第一題命名為:a1。圖2 程序界面圖隨后添加“提交答卷”按鈕的單擊事件,核心代碼如下: protected void Button1_Click(object sender, EventArgs e) /構(gòu)建內(nèi)存答題表dt,用來(lái)存放獲取的答題信息 DataTable dt = new DataTable(); dt.Columns.Add("UserID", typeof(int); dt.Columns.Add(&q
7、uot;QuestionID", typeof(int); dt.Columns.Add("Answer", typeof(string); int UserID = 0; int QuestionID = 0; string Answer = string.Empty; /采用遍歷獲取數(shù)據(jù) foreach (Control ctl in form1.Controls) /獲取單選題、判斷題的答題數(shù)據(jù) if (ctl is RadioButtonList) QuestionID = int.Parse(ctl.ID.Substring(1, ctl.ID.Leng
8、th - 1); Answer = (RadioButtonList)ctl).SelectedValue;/把數(shù)據(jù)添加到構(gòu)建的內(nèi)存答題表dt中 AddRow(ref dt, UserID, QuestionID, Answer); if (ctl is CheckBoxList) /獲取多選題的答題數(shù)據(jù) Answer = string.Empty; QuestionID = int.Parse(ctl.ID.Substring(1, ctl.ID.Length - 1); CheckBoxList cbl = (CheckBoxList)ctl; for (int i = 0; i <
9、 cbl.Items.Count; i+) 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"/省略部分是根據(jù)存儲(chǔ)過(guò)程得到UserID /更新內(nèi)存答題表dt信息
10、 foreach (DataRow dr in dt.Rows) dr"UserID" = UserID; /通過(guò)SqlBulkCopy把內(nèi)存答題表數(shù)據(jù)更新到Sql Server數(shù)據(jù)庫(kù)中 SqlBulkCopyData(dt); Label1.Text="提交答卷成功! " catch Label1.Text="系統(tǒng)錯(cuò)誤,請(qǐng)和系統(tǒng)管理員聯(lián)系! " 程序先在內(nèi)存中構(gòu)建用來(lái)存放答題信息的答題表dt,隨后采用遍歷的方式獲取答題的數(shù)據(jù),并通過(guò)AddRow()函數(shù)把獲取的數(shù)據(jù)保存在構(gòu)建的dt表中。AddRow()函數(shù)代碼如下:protected
11、 void AddRow(ref DataTable dt, int UserID, int QuestionID, string Answer) DataRow dr = dt.NewRow(); dr"UserID" = UserID; dr"QuestionID" = QuestionID; dr"Answer" = Answer; dt.Rows.Add(dr); 根據(jù)獲取的答題數(shù)據(jù)調(diào)用存儲(chǔ)過(guò)程AddNewUser保存用戶信息,返回用戶編號(hào)。更新答題表信息,通過(guò)SqlBulkCopy把答題表的數(shù)據(jù)批量加載到SQL Server
12、數(shù)據(jù)庫(kù)中,加載數(shù)據(jù)的代碼如下: protected void SqlBulkCopyData(DataTable dt) /使用SqlBulkCopy把內(nèi)存表DataTable里的數(shù)據(jù)插入答卷數(shù)據(jù)表 SqlBulkCopy bcp = new SqlBulkCopy(connectionString);/指定目標(biāo)數(shù)據(jù)庫(kù)的表名 bcp.DestinationTableName = "tAnswer" /建立數(shù)據(jù)源表字段和目標(biāo)表中的列之間的映射 SqlBulkCopyColumnMapping MapUserID = new SqlBulkCopyColumnMapping()
13、; MapUserID.DestinationColumn = "fUserID" MapUserID.SourceColumn = "UserID" bcp.ColumnMappings.Add(MapUserID); SqlBulkCopyColumnMapping MapQID = new SqlBulkCopyColumnMapping(); MapQID.DestinationColumn = "fQuestionID" MapQID.SourceColumn = "QuestionID" bcp.Col
14、umnMappings.Add(MapQID); SqlBulkCopyColumnMapping MapAnswer = new SqlBulkCopyColumnMapping(); MapAnswer.DestinationColumn = "fAnswer" MapAnswer.SourceColumn = "Answer" bcp.ColumnMappings.Add(MapAnswer); /寫(xiě)入數(shù)據(jù)庫(kù)表 bcp.WriteToServer(dt); bcp.Close(); SqlBulkCopy 包含一個(gè)方法 WriteToServer,
15、它用來(lái)從數(shù)據(jù)的源復(fù)制數(shù)據(jù)到數(shù)據(jù)的目的地。WriteToServer方法可以處理的數(shù)據(jù)類型有DataRow數(shù)組、DataTable 和 DataReader。根據(jù)實(shí)際情況,我們選用DataTable。程序先根據(jù)連接目標(biāo)數(shù)據(jù)庫(kù)的連接字符串生成SqlBulkCopy 實(shí)例,并指定DestinationTableName屬性,也就是目標(biāo)數(shù)據(jù)庫(kù)的表名。再通過(guò)SqlBulkCopyColumnMapping類,設(shè)置數(shù)據(jù)源字段到目標(biāo)數(shù)據(jù)表字段的映射。也就是說(shuō)如果目標(biāo)數(shù)據(jù)和源數(shù)據(jù)的列名不同時(shí),可以用這個(gè)類進(jìn)行映射。最后通過(guò)WriteToServer把數(shù)據(jù)加載到數(shù)據(jù)庫(kù)中。如果目標(biāo)表中的數(shù)據(jù)量比較大,需要設(shè)置SqlBulkCopy的BatchSize,使加載數(shù)據(jù)分批進(jìn)行,在每一批次結(jié)束時(shí),就將該批次中的行發(fā)送到數(shù)據(jù)庫(kù)。根據(jù)程序運(yùn)行情況,給用戶返回答卷提交結(jié)果。五、結(jié)束語(yǔ)以上程序在VS2005(C#),SQL Server 2005, Windows 2003 SP1環(huán)境下編譯調(diào)試通過(guò)。利用.NET 2.0引入的SqlBulkCopy新類,實(shí)現(xiàn)對(duì)SQL Serve
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品采購(gòu)合同范本
- 中小企業(yè)合同法務(wù)服務(wù)發(fā)展規(guī)劃定
- 個(gè)人商用房抵押貸款合同模板
- 產(chǎn)品銷售獨(dú)家代理合同模板
- 個(gè)人向單位租車合同及條款
- 個(gè)人向個(gè)人創(chuàng)業(yè)借款合同范本
- 臨時(shí)工勞動(dòng)合同范本(合同僅限勞務(wù)派遣使用)
- 個(gè)人住宅抵押借款合同簡(jiǎn)例范本
- 兼職人員勞務(wù)合同協(xié)議
- 購(gòu)物中心、商場(chǎng)商鋪?zhàn)赓U合同
- 魏寧海超買超賣指標(biāo)公式
- (正式版)FZ∕T 80014-2024 潔凈室服裝 通 用技術(shù)規(guī)范
- 新起點(diǎn)英語(yǔ)二年級(jí)下冊(cè)全冊(cè)教案
- 【幼兒園戶外體育活動(dòng)材料投放的現(xiàn)狀調(diào)查報(bào)告(定量論文)8700字】
- 剪映專業(yè)版:PC端短視頻制作(全彩慕課版) 課件 第3章 短視頻剪輯快速入門
- 湖南省長(zhǎng)沙市開(kāi)福區(qū)青竹湖湘一外國(guó)語(yǔ)學(xué)校2023-2024學(xué)年九年級(jí)下學(xué)期一模歷史試題
- 漢密爾頓抑郁和焦慮量表
- 風(fēng)電場(chǎng)事故案例分析
- 人教版八年級(jí)數(shù)學(xué)初中數(shù)學(xué)《平行四邊形》單元教材教學(xué)分析
- 八年級(jí)上冊(cè)-2024年中考?xì)v史總復(fù)習(xí)核心考點(diǎn)與重難點(diǎn)(部編版)
- 醫(yī)院科室人才建設(shè)規(guī)劃方案
評(píng)論
0/150
提交評(píng)論