下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、利用SqlBulkCopy實現網上答題系統(tǒng) 利用SqlBulkCopy實現網上答題系統(tǒng)正文:本文利用.Net 2.0引入的SqlBulkCopy新類結合SQL Server2005實現網上答題系統(tǒng)。介紹一種把其它數據源的數據批量加載到SQL Server表的高效方法,并確保其插入數據的完整性,一致性。 關鍵字.Net 2.0,C#,SqlBulkCopy,批量加載 一、前言問卷調查是獲取用戶信息最有效途徑之一,不管是企業(yè)單位,還是政府部門都廣泛采用。利用網上這種途徑來收集信息,可以節(jié)省大量的人力和物力。而同樣有獎問題、網上考試也被各個企業(yè)
2、單位廣泛應用。其實現方式都可以通過網上答題系統(tǒng)來實現。網上答題的題型主要有單項選擇題,多項選擇題和判斷題。以往網上答題系統(tǒng)的實現方式是程序收集用戶回答的答題信息,通過編寫事務,把答題信息逐條的寫入數據庫。這樣主要有兩個問題。一是需要開發(fā)人員自己寫事務來處理把答題信息插入數據庫。如果處理不好會使收集的答題信息不完整,給開發(fā)人員帶來不少的麻煩和開發(fā)難度。另外就是程序效率比較低下,特別是在題量比較大的情況下。通過.Net 2.0引入的SqlBulkCopy新類可以有效的解決這些問題。本文結合筆者的開發(fā)和應用實踐,詳細介紹利用SqlBulkCopy實現網上答題系統(tǒng)的原理和關鍵步驟。二、SqlBulkC
3、opy介紹SqlBulkCopy是.NET Framework 2.0新增的類,位于命名空間System.Data.SqlClient下,主要提供把其它數據源的數據有效批量的加載到SQL Server表中的功能。類似與 Microsoft SQL Server 包中名為 bcp 的命令行應用程序。但是使用 SqlBulkCopy 類可以編寫托管代碼解決方案,性能上優(yōu)于bcp命令行應用程序,更優(yōu)于如Insert方式向SQL Server表加載大量數據。SqlBulkCopy可以應用到大批量數據的轉移上,而不管數據源是什么。三、數據庫設計1、數據表設計打開SQL Server2005,建立數據表t
4、User和tAnswer,分別是用戶信息表和答題表。具體數據庫關系和字段如圖1所示:圖1 數據表及關系圖具體思路是:用戶根據答題內容回答完題,并填寫完用戶的個人信息。程序首先收集這些數據,并向用戶信息表插入用戶信息,返回該用戶的編號(即UserID)。再根據用戶編號生成內存表DataTable,利用SqlBulkCopy把內存表中數據批量的插入答題表。由數據提交的情況向用戶返回成功或失敗的消息。2、存儲過程設計新增一個存儲過程AddNewUser,完成根據姓名、電話和身份證號向用戶信息表插入用戶信息,返回自增量字段生成的用戶ID號功能,具體代碼如下:CREATE PROCEDURE dbo.A
5、ddNewUserfUserName 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!=0rollbackelsecommit四、程序實現 根據圖2制作網頁,其中單項選擇題和判斷題使用RadioBu
6、ttonList服務器控件,多項選擇題使用CheckBoxList服務器控件。設置好各服務器控件的屬性,題所使用控件的命名采用“題型序號”的命名方式,如選擇題第一題命名為:a1。圖2 程序界面圖隨后添加“提交答卷”按鈕的單擊事件,核心代碼如下: protected void Button1_Click(object sender, EventArgs e) /構建內存答題表dt,用來存放獲取的答題信息 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; /采用遍歷獲取數據 foreach (Control ctl in form1.Controls) /獲取單選題、判斷題的答題數據 if (ctl is RadioButtonList) QuestionID = int.Parse(ctl.ID.Substring(1, ctl.ID.Leng
8、th - 1); Answer = (RadioButtonList)ctl).SelectedValue;/把數據添加到構建的內存答題表dt中 AddRow(ref dt, UserID, QuestionID, Answer); if (ctl is CheckBoxList) /獲取多選題的答題數據 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"/省略部分是根據存儲過程得到UserID /更新內存答題表dt信息
10、 foreach (DataRow dr in dt.Rows) dr"UserID" = UserID; /通過SqlBulkCopy把內存答題表數據更新到Sql Server數據庫中 SqlBulkCopyData(dt); Label1.Text="提交答卷成功! " catch Label1.Text="系統(tǒng)錯誤,請和系統(tǒng)管理員聯系! " 程序先在內存中構建用來存放答題信息的答題表dt,隨后采用遍歷的方式獲取答題的數據,并通過AddRow()函數把獲取的數據保存在構建的dt表中。AddRow()函數代碼如下: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); 根據獲取的答題數據調用存儲過程AddNewUser保存用戶信息,返回用戶編號。更新答題表信息,通過SqlBulkCopy把答題表的數據批量加載到SQL Server
12、數據庫中,加載數據的代碼如下: protected void SqlBulkCopyData(DataTable dt) /使用SqlBulkCopy把內存表DataTable里的數據插入答卷數據表 SqlBulkCopy bcp = new SqlBulkCopy(connectionString);/指定目標數據庫的表名 bcp.DestinationTableName = "tAnswer" /建立數據源表字段和目標表中的列之間的映射 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); /寫入數據庫表 bcp.WriteToServer(dt); bcp.Close(); SqlBulkCopy 包含一個方法 WriteToServer,
15、它用來從數據的源復制數據到數據的目的地。WriteToServer方法可以處理的數據類型有DataRow數組、DataTable 和 DataReader。根據實際情況,我們選用DataTable。程序先根據連接目標數據庫的連接字符串生成SqlBulkCopy 實例,并指定DestinationTableName屬性,也就是目標數據庫的表名。再通過SqlBulkCopyColumnMapping類,設置數據源字段到目標數據表字段的映射。也就是說如果目標數據和源數據的列名不同時,可以用這個類進行映射。最后通過WriteToServer把數據加載到數據庫中。如果目標表中的數據量比較大,需要設置SqlBulkCopy的BatchSize,使加載數據分批進行,在每一批次結束時,就將該批次中的行發(fā)送到數據庫。根據程序運行情況,給用戶返回答卷提交結果。五、結束語以上程序在VS2005(C#),SQL Server 2005, Windows 2003 SP1環(huán)境下編譯調試通過。利用.NET 2.0引入的SqlBulkCopy新類,實現對SQL Serve
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)服務協(xié)議續(xù)簽文檔:保障雙方權益(2024版)版
- 2024年05月上海中國銀聯“銀星”實習生招考筆試歷年參考題庫附帶答案詳解
- 2025年度軍事工程專用鋼管扣件運輸安全保密協(xié)議3篇
- 2025年度合同封面定制與法律風險防控策略合同3篇
- 專項補充貸款協(xié)議規(guī)范示例2024一
- 2025年度產品陳列與品牌形象提升協(xié)議書3篇
- 2025年廠房建筑合同范本:廠房建筑與環(huán)保驗收合同規(guī)范4篇
- 2025年產業(yè)園區(qū)場地租賃與產業(yè)金融服務合同4篇
- 醫(yī)療安全知識培訓
- 2025年度虛擬現實產品設計保密合同(全新版)4篇
- 部編新改版語文一年級下冊《語文園地四》教學設計
- 2025年北京鐵路局集團招聘筆試參考題庫含答案解析
- 《藥品招商營銷概論》課件
- 曙光磁盤陣列DS800-G10售前培訓資料V1.0
- 寺廟祈?;顒臃桨?共6篇)
- 2025年病案編碼員資格證試題庫(含答案)
- 企業(yè)財務三年戰(zhàn)略規(guī)劃
- 提高膿毒性休克患者1h集束化措施落實率
- 山東省濟南市天橋區(qū)2024-2025學年八年級數學上學期期中考試試題
- 主播mcn合同模板
- 2024測繪個人年終工作總結
評論
0/150
提交評論