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


上一節我們簡單介紹了數據庫的讀寫,所使用的數據庫都是隨便寫的(用水果代替,但不是真正的食品零售數據表,至少沒有價格,銷量等等)。這一節我們思考如何實現一個測試題的數據庫,所謂的測試題數據庫就是假定系統里預存了1000道題目,每個學生考試隨機抽查50題,以保證每次考試很難相互抄襲,而且每個題目設置時間限制,到時間不作答就認為放棄,考試完成自動閱卷等等,這些功能都是普通的紙質考試沒法實現的。

 

那么首先就是數據庫的設計,能夠想到的試題至少包含下面的信息(題目的參考答案和當前答案是一個很難講的問題,比如選擇題有多選的情況,比如簡答題沒法一一對應的情況,但是為了簡化起見還是應該先做成字符串,如果用戶回答A,B,C三個而正確答案是AB兩個,則錯選0分,如果正確答案是ABCD,則漏選得一半分數,這些復雜的邏輯處理要后面慢慢優化,一開始要先把大的框架搭建好)

初步設計成兩張表,一個是試題庫,一個是考試記錄庫(可能我們需要統計有多少人參加了考試,考試的結果,每個學生的成績之類的,表的結構不合理后面可以再修改,基本的功能應該夠了)

 

有了數據庫之后,下面一步就是錄入試題(對應了數據庫的增加),可以想象淘寶網如果沒有賣家先把寶貝傳到數據庫,買家搜不到任何東西,這個網站也沒有任何價值,所以數據庫首先要有內容,我們要首先設計一個人機界面,給老師錄入試題。注意要盡量用最適合的控件,比如編號就是數字上下的控件,試題類型就是combobox,而文本框也要做一些限制,比如只允許輸入數字(可以提高軟件的用戶體驗)

 

把數據庫的連接做成一個標准方法,例如我們可以指定在連接的時候需要給目標數據庫的路徑,密碼,數據表的名稱(其實還可以做得更復雜,比如不帶密碼則密碼設置為空,當檢測到密碼為空的時候就用不帶密碼的語句),注意把原來字符串替換成變量的寫法,選出來之后替換成兩個雙引號,然后再在中間加兩個空格,再在空格中加變量名,這樣不容易出錯,連接成功或者失敗也是布爾值對外返回。

 

為了讓代碼更加整潔,對一個題目所包含的全部信息,我們都做成一個結構體(這個結構體要跟數據庫對應起來),這個數據庫增加方法就比較簡潔,只需要傳入一個自定義類型即可

 

在點擊錄入按鈕的時候,首先實例化一個結構體,然后執行具體函數,為了測試方便可以隨便錄入幾個數據(我們可以從數據庫更精簡的角度出發,如果問題類型保存原模原樣的字符串"判斷題","選擇題","簡答題",那么同樣的一條記錄會耗費更多的存儲空間,所以在真正的數據庫設計中都需要把每個字段設計的盡可能簡潔)

 

把數據錄入的方法也做成函數的方式,注意傳入的是一個結構體類型(這個結構體就對應一條記錄,以后一種數據庫文件的讀寫對應一種結構體,也對應一種方法這樣做比較好移植和修改)

 

數據錄入其實首先要執行一個數據查詢,比如你淘寶注冊一個賬號,上傳一個寶貝,肯定有很多規則限制。賬號的用戶名不允許非法字符,寶貝的描述不允許有敏感字符等等。我們這里因為只是自己用,所以可以暫時不考慮這些,但是試題編號肯定要求唯一,不然就有缺陷了,沒法真正排序得到從小到大的結果了(我們可能還想着1-100題都是判斷題,101-200題都是選擇題,出題的時候從1-100和101-200都隨機出20題這樣)

 

有了數據庫內容的錄入,就需要考慮修改和刪除(當然你直接打開數據庫像操作Excel一樣也是一種方法,但是不推薦這么做),在做頁面之前需要注意,我們用了一個tabcontrol來更好的管理整個程序布局,在代碼上也要划區域,不要搞得很亂,所有跟試題錄入相關的方法都放在一起,並用一個region括起來(跟全局的也要分開)

 

整個試題查看的界面設計如下,為了方便快速查看試題,還需要做上一題/下一題的按鈕(或者像很多網頁一樣顯示1-10條,11-20條這種十個記錄一次顯示,我們都會在下面講到,在試題查看的時候我們把試題的ID也顯示出來了,而在試題錄入的時候是沒有的,因為只有執行完畢才會生成一個唯一的ID,這里試題查看/修改/刪除都是根據這個唯一的ID來的,而不是編號)

 

在切換到試題查看頁面的時候,我們需要遍歷數據庫得到所有的記錄,然后放到comboBox給用戶隨時選擇切換試題(這里寫了一個DataBaseQuestionGetALL的方法,就是對數據庫的所有記錄根據某個字段升序或者降序提取出來,參考前面一章直接把ACCESS讀取並放到DataGridView顯示的功能,這里我們也用到了類似的功能)

 

這里我們做了一個List可變數組,把所有記錄放在List中,但是其實這樣做在真實的項目中還是會有問題,比如一個淘寶商品有太多屬性,商品描述包含的圖片,文字信息有幾千個字符,你一條記錄就很大,幾十萬條幾百萬條記錄要統統存到一個List里面你程序就卡死了(而實際上我們目的只是要方便用戶快速選擇試題,所以只列舉跟當前試題編號接近的10個題目就行了)

 

所以就有了"上一題","下一題"的功能需求。比如我要選擇試題編號比當前NO大的三條,並且從小到大排序,或者要選擇比當前NO小的一條,就可以使用較為復雜的Select語句,你需要 Top X * 並且添加order by XXX, asc或者desc分別表示升序和降序(第一依據是Question_NO的升序,第二依據是ID的升序,因為第一依據不是主鍵,可能會有重復的Question_NO,或者按試題分數,限制時間排序都不一定是唯一的,如果不唯一這個select語句就可能不按照你的提示選出來指定的記錄數,所以最后要再跟一個唯一的主鍵ID的排序)

 

修改此題也比較好理解了,注意跟前面一樣,傳入的是一個結構體類型,修改成功或者失敗都有返回值

 

刪除也比較好理解,只不過刪除了這一題,為了提高用戶體驗,還需要直接刷新到下一題(如果真的要做優化還是有很多判斷沒有做,比如當前就是最后一題,那么就跳到上一題或者第一題,刪除之前彈出個確認框之類的)

 

 

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

我的優酷空間:

http://i.youku.com/acetaohai123

 

我的在線論壇:

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

 

問題交流:

QQ:910358960

郵箱:acetaohai123@163.com

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM