iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 28
1
Software Development

從問題理解與活用SQL語法系列 第 28

第二十八堂:英文單字測驗程式 - 單字測驗 - 亂數取得單字 (LIMIT、TOP、綜合練習)

一、課程程式專案與資料庫範本SQL Github

https://github.com/ted59438/EnglishVocabulary_MySQL

  • EnglishVocabularyLearning.exe:英文單字測驗最終的實作結果
  • DBPlayground:課堂的C#範例專案
  • EnglishVocabularyLearning_MySQL:C#練習專案
  • EnglishVocabulary.sql:MySQL的範本資料
  • EnglishVocabulary_MSSQL.sql:SQL Server 的範本資料

二、綜合練習:將測驗功能修改成資料庫架構

(一) 登入測驗

點擊主畫面的「開始測驗」,測驗前需要輸入學生自己的帳號、密碼、單字分類、測驗時間
https://ithelp.ithome.com.tw/upload/images/20191014/201203311dh34bvo4S.png

https://ithelp.ithome.com.tw/upload/images/20191014/20120331GscfWgWL9y.png

如果帳號或密碼錯誤,無法測驗
https://ithelp.ithome.com.tw/upload/images/20191014/20120331ovtUN6OeQH.png

如果帳號與密碼吻合,從選擇的分類挑選五個單字,進入並開始測驗
https://ithelp.ithome.com.tw/upload/images/20191014/20120331BZAgWj3rA3.png

(二) 完成測驗:將測驗的結果寫入測驗主明細表

一個測驗(主表)會有好幾個題目(明細),每一個題目(明細)對應同一個測驗(主表)

https://ithelp.ithome.com.tw/upload/images/20191014/20120331aQ1JJapxnK.png

1.測驗主明細結構

https://ithelp.ithome.com.tw/upload/images/20191014/20120331dAUSF9GOnT.png

2.測驗主表範本 (Exam_Master)

https://ithelp.ithome.com.tw/upload/images/20191014/20120331vKhz4Wm1UH.png

  • ExamID:測驗主檔ID
  • StartDateTime:測驗開始時間
  • EndDateTime:測驗結束時間
  • CategoryID:測驗分類ID (來自Category表)
  • StudentID:測驗學生ID (來自Student表)
  • CorrectNumber:正確題數
  • WrongNumber:錯誤題數
  • Rate:測驗總分

3.測驗明細表範本 (Exam_Detail)

https://ithelp.ithome.com.tw/upload/images/20191014/20120331dVRHzVJTuw.png

  • Exam_DetailID:測驗明細ID
  • ExamID:測驗主檔ID (來自Exam_Master表)
  • OrderNumber:題號
  • Vocabulary:題目單字ID (來自Vocabulary表)
  • IsCorrect:該題是否答對
  • UserAnswer:使用者作答的拼字

三、本堂內容

(一) 實作結果

從所有單字當中隨機挑選五個單字
https://ithelp.ithome.com.tw/upload/images/20191014/20120331WsT1YltGZL.png

(二) 實作程式碼

/// <summary>
/// 隨機取得單字的按鈕事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void queryVocabularyBtn_Click(object sender, EventArgs e)
{
    string sql = @"SELECT *
                   FROM Vocabulary
                   ORDER BY RAND()
                   LIMIT 5";
    Dictionary<string, object> parameters = new Dictionary<string, object>();
    try
    {
        queryVocabularyGrid.DataSource = queryDT(sql, parameters);

        queryVocabularyGrid.Columns["VocabularyID"].Visible = false;
        queryVocabularyGrid.Columns["CategoryID"].Visible = false;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

(三)講解:取得查詢當中的前幾筆資料

1. SQL Server

(1) 從第一個單字開始往下取10個單字

SELECT TOP 10
       *
FROM Vocabulary

(2) 從第6個單字開始往下取10個單字 (不從第一個單字)

SELECT *
FROM Vocabulary
OFFSET 5 ROWS --往後遞延5筆
FETCH NEXT 10 ROWS ONLY; -- 第6筆~第15筆

2. MySQL

從第6個單字開始往下取10個單字

SELECT * 
FROM Vocabulary
LIMIT 10 OFFSET 5

上一篇
第二十七堂:英文單字測驗程式 - 學生帳號資料管理(6) - 物件實體操作資料 (ORM、Entity Framework)
下一篇
第二十九堂:英文單字測驗程式 - 測驗主明細紀錄與正確率統計 (綜合練習)
系列文
從問題理解與活用SQL語法30

尚未有邦友留言

立即登入留言