1. 程式人生 > >C#基礎視頻教程6.3 如何簡單讀寫數據庫

C#基礎視頻教程6.3 如何簡單讀寫數據庫

一點 犯錯 .html ack ble 數字 擴展 你知道 定義

在繼續往下做之前,我們需要把之前的代碼盡可能的精簡(會對後面很有好處,而且讀者也應該仔細比對這一部分的代碼和上一部分哪裏真正得到了優化,從而提高編程水平)。

首先數據庫的操作類有哪些是可以做的更加普遍,變量名也通用的,至少要連接的目標數據庫名稱,目標工作薄,密碼都應該是通用的,連接方法也是通用的,所以應該把連接到數據庫的這個方法獨立出來(我後面要寫一個讀寫QuestionUser的類只要復制粘貼修修改改即可)

技術分享

?

其次增查刪改的幾個方法,是否有必要做的更通用呢?這些方法要麽輸入類型要指定的結構體,要麽輸出類型是指定的結構體,如果復制粘貼重寫一個類似的類,結構體肯定變了,每個讀寫的數據肯定也變了,所以這個肯定沒法做的很通用(或許你可以把函數名做的很通用,比如DataBaseAdd,就是增加方法,A.DataBaseAdd就是按照A指定的記錄結構增加,B.DataBaseAdd就是按照B指定的記錄結構體增加,而不一定是QuestionAdd,也可能是AnswerAdd,這樣做也是有好處的,讀者可以自己嘗試)

技術分享

?

界面部分可以完善的代碼就很多了。其實不管是新增試題還是修改試題,每個跟數據庫交互的點只有兩個,要麽從數據庫拿著數據去更新界面,要麽從界面拿著數據去更新數據庫。由此不管是"上一題","下一題",還是"更新此題",大部分代碼都是可以復用的,你用什麽方法篩選出來特定的記錄我不管,但是最後更新到界面的方法都可以統一起來,由此可以有一個QuestionUpdateSetToUI方法。

技術分享

?

同樣從界面更新數據就可以叫做QuestionUpdateGetFromUI,並且把試題錄入和試題查看分來,試題錄入倒是沒有從數據庫反過來更新界面的方法(或者也可以有,錄進去一個題目,自動清空文本框,準備更新下一題,不然還是不容易判斷錄進去沒有)

技術分享

?

關於測試題,我網上看了很多"權威"的測試題,感覺非常誤導人。一個是這些題目並不適合初學者,沒必要去掌握。就像你去學習開車沒必要掌握發動機原理一樣,甚至了解都不需要。再有一個即便要理解發動機原理也不是這麽死記硬背的方式(不是你背下來了就代表你會了,什麽重載,封裝,委托,你像背馬哲那麽弄肯定考試能合格,但是沒法判定你是不是真的懂)

http://blog.sina.com.cn/s/blog_485502810101dtp5.html

http://3y.uu456.com/bp_41rym11l6p8xzko047mj_3.html

技術分享

?

我自己想了一些測試題,基本上都是要求自己編程能夠實現,不管你用什麽方法做出來,能做出來就是合格的,前面的簡答題比如5分一個,給1分鐘時間,後面的簡答題10分一個,給10分鐘時間(實際考試的時候隨機抽12個5分的,4個10分的),問的都是應該要會的(不能問太刁鉆的,比如問INT類型的數值範圍,你知道不代表你厲害,你不知道也不代表你不行,那提這個問題就比較傻逼。主要還是告訴讀者不要被考試題糊弄住了,考試合格只會給你發一張證,能力合格才會給你帶來實實在在的錢,成天玩考試套路的那些貨也不需要能力,也不會在解決問題中鍛煉能力)

技術分享

?

講了半天廢話,我們接著完善這個程序。如果點擊開始考試,則開始隨機抽查題目。因為前面已經有了1-20的題號,隨機拿12個(60分),101-120的題號,隨機拿4個(40分),那麽我們首先要寫一個小算法,就是給定一個起始值,終止值,然後可以生成一個隨機數(更復雜一點的,要生成若幹個隨機數,且不能相互重復),那麽首要的是實現產生一個隨機數,為了快速驗證,可以先用一個label和button來驗證產生的數字是否在範圍內。

技術分享

?

單個數據驗證之後,再來看如何產生一組隨機數,且不重復(或者再從小到大排序),產生一組隨機數,可以直接調用產生一個隨機數的方法,這裏註意寫法不唯一。而且也建議用戶盡量把一個復雜的功能剝離開來做成幾個小方法的組合(比如產生一組隨機數=產生一個隨機數+判斷隨機數是否重復+是否需要排序等等,這些小的方法也定義在FunctionMath中,但是並不需要主程序調用,所以都做成private方法即可)

技術分享

?

有了這個功能,我們已經可以來設計考試的模塊了。假定用戶點擊開始考試,要在5分的題目裏抽幾個,再在10分的題目裏抽幾個。這個功能已經比較好實現了。我們之前已經有了寫計算器和超級熱鍵的經驗,這裏就不把變量都放在Form1裏面了,而是直接新建一個類來接管整個考試的流程。先不管如何實現整個流程,我們可以規劃出來要實現考試這個方法,必不可少的一些屬性和方法(我們已經知道了是從一個大的集合中抽取一個小的集合,當然也可以再做一個集合認為是所有抽到的試題列表,方便程序處理),在方法上我們至少需要

初始化方法-生成新的隨機試題序列

某個試題提取方法-把對應試題的編號找到數據對應的內容並顯示到界面

完整考試方法-從第一題開始做到最後一題結束的整個循環的自動化處理

技術分享

?

初始化方法已經驗證過了,核心就是抽取試題,我們放到變量QuestionALL的變量中(這個變量也可以用double數組來做,用list擴展性更好,假如你後續又增加了判斷題,選擇題,所以題目放到一起成一個集合,題目的分值,種類和數量都變了,用數組做就不太好改),為了逐步驗證,每次初始化可以輸出看一下是不是按我們要求12個小題目+4個大題目出來了(序號分別為1-20和101-120的),最後設置一個Index為0,這個我們待會兒講為什麽要有這個Index

技術分享

?

挨個試題開始考試的前提是某一個試題能夠被準備從數據庫讀取並反映到界面上,所以我們首先要寫的是單獨試題的讀取,註意界面該做成只讀的都設置成只讀,尤其是文本框,而且為了驗證可以先放一些textbox往裏面手動輸入數字,看點擊重新抽題的時候能不能準確反映到對應的試題(實際上重新抽題應該是反映隨機題目序列的第一題,而不是數據庫的編號為1的題目)。這裏的響應我們是在Form1點擊的按鈕,根據結果是否為TRUE決定是否更新界面的,實際上更科學的方式是委托和事件(後面會講到怎麽做),目前先管好整個的程序流程。

技術分享

?

從開始考試到考試結束,我們全程用一個Index來決定(上一題則Index--,下一題則Index++,確認答題也是Index++,只不過確認答題會把當前回答保存起來,是否立即存入數據庫讀者可以自己決定,一般題目量很少可以都存起來,等最後完成了再統一存入)。由於有了這個Index,我們針對每一題都可以有一些額外的list變量保存(當前試題是否已經作答,所耗費的時間,對應的具體回答文本等)

技術分享

?

為了給每一題的時間限制起效果,每一題啟動的時候我們要同步啟動一個秒表和定時器(秒表是為了統計當前耗時,定時器是為了在主界面上顯示當前耗時,並且判斷如果超時就強制回答並進入下一題),先來看這個定時器,我們在主界面上放一個定時器,是最簡單的辦法(控件總歸比寫代碼簡單),因為不需要特別精確,默認時間間隔100ms,每隔100ms檢測是否超時,如果超時則報警並進入下一題。我們在ExamHandler中定義了一個全局的布爾值CurrentTimeOverlap變量,如果不做這個變量,則一旦超時彈窗會不斷的彈出來,這也是一個比較重要的編程技巧,讀者需要學會。

技術分享

?

再來看秒表的功能,秒表其實就幾個方法,Reset,Start,Stop,GetTime(重置/啟動/停止/獲取時間),只要進入到一個新的題目,則先重置,再啟動(Reset+Start),運行的時候隨時可以被別人獲取當前時間(GetTime),超過時間之後不再計時並獲取當前時間(Stop),測試如果超時之後進入下一題,再回到上一題,顯示的就不是時間限制,而是答題時間(更多的用戶體驗優化也可以做,比如已經回答過這個問題,則確認答題按鈕不可用,不給用戶犯錯的機會)

技術分享

?

答題完成,把所有信息錄入新的數據庫表,為此我們需要新建一個新的表(註意新的表不要填寫重復信息,我們根據Question_NO已經可以到第一張表找到這個題目的分值,時間限制,具體題目內容等等,這裏就沒有必要再寫一次,QuestionUser只需要保留用戶回答的相關信息),其實還是存在多余的信息,比如只需要一個考試的ID就行了,不需要考生的名字和所在公司,公司名字和人的名字都不是唯一的,我們可以再做一張表專門保存考生的信息,目前這樣做每一條考試的數據記錄都會重復寫一次考試姓名和所在公司

技術分享

?

在此只做簡單示意,如果再做一張數據表,這個表存儲的就是用戶的信息了(姓名,性別,年齡,所在公司,工作經驗,參加考試時間,總的得分,其他備註等等),為了跟其他表鏈接起來,對每一個考生要有一個類似於身份證號一樣的編號來隨時找到這個用戶考的哪些試題,都用了多少時間,每一題的得分(所以數據庫並不是一開始就能設計的非常合理,需要不斷的改進,並且是弄完了一個版本之後才發現不合理,再改進,以後再做類似的項目的時候會更有經驗,少走彎路)。

技術分享

?

有了前面的錄入試題我們這裏抄一份,稍微修改即可,定義一個類似的結構體,然後連接方法和增加方法都類似

技術分享

?

具體我要交卷的時候就是遍歷list,把結構挨個ADD到數據庫即可(暫時不考慮非法值,也先把分值先設置為0分,在評分的欄目裏可以改)

技術分享

?

同樣是ADD方法,只需要修改對應的字段即可(這裏貌似不需要刪除或者更新,查詢的方法,在評分欄目可以做查詢和更新的方法)

技術分享

?

最後思考一下開始評分的功能(時間限制就不具體介紹了,反正後面有幾個簡答題還用這種流程做也不太合理),實際上開始評分應該是跟開始考試錄入同一個數據庫(開始考試我們把數據庫的一條記錄的大部分信息填寫完整了,剩下的分數,最終得分,或者更多額外的信息比如考試等級都是在開始評分完成,開始評分就是先讀取完成了一部分的數據記錄,把這個考試的所有記錄都搜出來,按編號從小到大排序,然後挨個打分並再次更新數據庫就結束了,整個過程就是本質就是UPDATE,感興趣的讀者可以自己完善整個功能)

技術分享

?

更多功能可以探討:

如果用戶提前做完一題,他是否應該得到時間的獎勵?

如果用戶不斷的重新抽題,是否應該給與警告甚至禁止,是否應該取消上一題/下一題的查看功能?

考試結束,如何把題目完整上傳到某個地方(尤其是後面10分的上級實驗題,沒法做自動評分,只能人工審核)?

?

總結:本節課程簡單介紹了數據庫的讀寫,這個看你具體做什麽應用,如果做互聯網相關的開發,肯定會經常碰到,傳統工控行業貌似需求不大,但是往後物聯網,人工智能,大數據等等比較新潮的領域也一定少不了,所謂的大數據首先要有一大批數據,肯定用TXT或者XML這種東西hold不住了。所以至少對數據庫有一個基本的認識,能簡單實現功能還是很有必要的。

1 理解數據庫的基本操作,增查刪改

2 體會數據庫讀寫的方法改善,為什麽要定義這些變量,是否在代碼上還有更多精簡的可能

3 不斷改進代碼的前後臺質量,把同類的功能合並到一起,盡可能的減少重復代碼,想清楚要怎麽設計數據庫,設計一個函數,一個類,然後再去一小塊一小塊的實現和驗證

?

?

更多教學視頻和資料下載,歡迎關註以下信息:

我的優酷空間:

http://i.youku.com/acetaohai123

技術分享

?

我的在線論壇:

http://csrobot.gz01.bdysite.com/

技術分享

?

問題交流:

QQ:910358960

郵箱:[email protected]

?

?

C#基礎視頻教程6.3 如何簡單讀寫數據庫