




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、利用SqlBulkCopy實現(xiàn)網(wǎng)上答題系統(tǒng) 利用SqlBulkCopy實現(xiàn)網(wǎng)上答題系統(tǒng)正文:本文利用.Net 2.0引入的SqlBulkCopy新類結(jié)合SQL Server2005實現(xiàn)網(wǎng)上答題系統(tǒng)。介紹一種把其它數(shù)據(jù)源的數(shù)據(jù)批量加載到SQL Server表的高效方法,并確保其插入數(shù)據(jù)的完整性,一致性。 關(guān)鍵字.Net 2.0,C#,SqlBulkCopy,批量加載 一、前言問卷調(diào)查是獲取用戶信息最有效途徑之一,不管是企業(yè)單位,還是政府部門都廣泛采用。利用網(wǎng)上這種途徑來收集信息,可以節(jié)省大量的人力和物力。而同樣有獎問題、網(wǎng)上考試也被各個企業(yè)
2、單位廣泛應用。其實現(xiàn)方式都可以通過網(wǎng)上答題系統(tǒng)來實現(xiàn)。網(wǎng)上答題的題型主要有單項選擇題,多項選擇題和判斷題。以往網(wǎng)上答題系統(tǒng)的實現(xiàn)方式是程序收集用戶回答的答題信息,通過編寫事務,把答題信息逐條的寫入數(shù)據(jù)庫。這樣主要有兩個問題。一是需要開發(fā)人員自己寫事務來處理把答題信息插入數(shù)據(jù)庫。如果處理不好會使收集的答題信息不完整,給開發(fā)人員帶來不少的麻煩和開發(fā)難度。另外就是程序效率比較低下,特別是在題量比較大的情況下。通過.Net 2.0引入的SqlBulkCopy新類可以有效的解決這些問題。本文結(jié)合筆者的開發(fā)和應用實踐,詳細介紹利用SqlBulkCopy實現(xiàn)網(wǎng)上答題系統(tǒng)的原理和關(guān)鍵步驟。二、SqlBulkC
3、opy介紹三、數(shù)據(jù)庫設計1、數(shù)據(jù)表設計打開SQL Server2005,建立數(shù)據(jù)表tUser和tAnswer,分別是用戶信息表和答題表。具體數(shù)據(jù)庫關(guān)系和字段如圖1所示:圖1 數(shù)據(jù)表及關(guān)系圖具體思路是:用戶根據(jù)答題內(nèi)容回答完題,并填寫完用戶的個人信息。程序首先收集這些數(shù)據(jù),并向用戶信息表插入用戶信息,返回該用戶的編號(即UserID)。再根據(jù)用戶編號生成內(nèi)存表DataTable,利用SqlBulkCopy把內(nèi)存表中數(shù)據(jù)批量的插入答題表。由數(shù)據(jù)提交的情況向用戶返回成功或失敗的消息。2、存儲過程設計新增一個存儲過程AddNewUser,完成根據(jù)姓名、電話和身份證號向用戶信息表插入用戶信息,返回自增量
4、字段生成的用戶ID號功能,具體代碼如下:CREATE PROCEDURE dbo.AddNewUserfUserName 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號if error!=0rollbackelse
5、commit四、程序?qū)崿F(xiàn) 根據(jù)圖2制作網(wǎng)頁,其中單項選擇題和判斷題使用RadioButtonList服務器控件,多項選擇題使用CheckBoxList服務器控件。設置好各服務器控件的屬性,題所使用控件的命名采用“題型序號”的命名方式,如選擇題第一題命名為:a1。圖2 程序界面圖隨后添加“提交答卷”按鈕的單擊事件,核心代碼如下: protected void Button1_Click(object sender, EventArgs e) /構(gòu)建內(nèi)存答題表dt,用來存放獲取的答題信息 DataTable dt = new DataTable(); int UserID = 0; int Que
6、stionID = 0; string Answer = string.Empty; /采用遍歷獲取數(shù)據(jù) foreach (Control ctl in form1.Controls) /獲取單選題、判斷題的答題數(shù)據(jù) if (ctl is RadioButtonList) 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.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"/省略部分是根據(jù)存儲過程
8、得到UserID /更新內(nèi)存答題表dt信息 foreach (DataRow dr in dt.Rows) dr"UserID" = UserID; /通過SqlBulkCopy把內(nèi)存答題表數(shù)據(jù)更新到Sql Server數(shù)據(jù)庫中 SqlBulkCopyData(dt); Label1.Text="提交答卷成功! " catch Label1.Text="系統(tǒng)錯誤,請和系統(tǒng)管理員聯(lián)系! " 程序先在內(nèi)存中構(gòu)建用來存放答題信息的答題表dt,隨后采用遍歷的方式獲取答題的數(shù)據(jù),并通過AddRow()函數(shù)把獲取的數(shù)據(jù)保存在構(gòu)建的dt表中。Add
9、Row()函數(shù)代碼如下: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; 根據(jù)獲取的答題數(shù)據(jù)調(diào)用存儲過程AddNewUser保存用戶信息,返回用戶編號。更新答題表信息,通過SqlBulkCopy把答題表的數(shù)據(jù)批量加載到SQL Se
10、rver數(shù)據(jù)庫中,加載數(shù)據(jù)的代碼如下: protected void SqlBulkCopyData(DataTable dt) /使用SqlBulkCopy把內(nèi)存表DataTable里的數(shù)據(jù)插入答卷數(shù)據(jù)表 SqlBulkCopy bcp = new SqlBulkCopy(connectionString);/指定目標數(shù)據(jù)庫的表名 bcp.DestinationTableName = "tAnswer" /建立數(shù)據(jù)源表字段和目標表中的列之間的映射 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" /寫入數(shù)據(jù)庫表 bcp.WriteToServer(dt); bcp.Close(); SqlBulkCopy 包含一個方法 WriteToServer,它用來從數(shù)據(jù)的源復制數(shù)據(jù)到數(shù)據(jù)的目的地。WriteToServer方法可以處理的數(shù)據(jù)類型有DataRow數(shù)組、DataTable 和 DataReader。根據(jù)實際情況,我們選用DataTable
13、。程序先根據(jù)連接目標數(shù)據(jù)庫的連接字符串生成SqlBulkCopy 實例,并指定DestinationTableName屬性,也就是目標數(shù)據(jù)庫的表名。再通過SqlBulkCopyColumnMapping類,設置數(shù)據(jù)源字段到目標數(shù)據(jù)表字段的映射。也就是說如果目標數(shù)據(jù)和源數(shù)據(jù)的列名不同時,可以用這個類進行映射。最后通過WriteToServer把數(shù)據(jù)加載到數(shù)據(jù)庫中。如果目標表中的數(shù)據(jù)量比較大,需要設置SqlBulkCopy的BatchSize,使加載數(shù)據(jù)分批進行,在每一批次結(jié)束時,就將該批次中的行發(fā)送到數(shù)據(jù)庫。根據(jù)程序運行情況,給用戶返回答卷提交結(jié)果。五、結(jié)束語以上程序在VS2005(C#),SQL Server 2005, Windows 2003 SP1環(huán)境下編譯調(diào)試通過。利用.NET 2.0引入的SqlBulkCopy新類,實現(xiàn)對SQL Server數(shù)據(jù)庫的批量加載。這種技術(shù)在實際開發(fā)項目網(wǎng)上答題系統(tǒng)中得到了充分利
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨床試驗結(jié)果分析原則考核試卷
- 農(nóng)機租賃市場定位與租賃服務網(wǎng)絡布局分析考核試卷
- 講座教育的評價體系考核試卷
- 交通規(guī)劃與災害恢復重建規(guī)劃協(xié)調(diào)考核試卷
- 產(chǎn)科病房護士工作總結(jié)10篇
- 會計專業(yè)考試初級會計實務試卷與參考答案(2025年)
- 湖南省名校聯(lián)考聯(lián)合體2024-2025學年高一下學期第二次聯(lián)考物理試卷(A)(含解析)
- 歌曲活動策劃方案
- 植樹節(jié)汽車養(yǎng)護活動方案
- 民政服務活動方案
- 打印-初升高銜接教材物理
- 2023年湖北省高中學業(yè)水平合格性考試語文試卷真題(答案詳解)
- 中國現(xiàn)代文學中的革命文學思潮
- 寧夏銀川外國語實驗學校2024屆數(shù)學七下期末教學質(zhì)量檢測試題含解析
- 農(nóng)村集體聚餐食品安全管理培訓課件
- 電子文件管理復習資料
- 水龍頭知識培訓課件
- 四川省三臺縣教育和體育局為城區(qū)學校公開遴選51名部分緊缺學科教師筆試歷年高頻考點試題含答案帶詳解
- 道德與法治課程2022課標解讀
- 從deepfakes深度偽造技術(shù)看AI安全
- 東莞職業(yè)技術(shù)學院輔導員考試題庫
評論
0/150
提交評論