iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 26
1
Software Development

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

第二十六堂:英文單字測驗程式 - 學生帳號資料管理(5) - 修改學生與刪除學生 (認識實體)

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

https://github.com/ted59438/EnglishVocabulary_MySQL

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

二、本堂作業

  1. 完成單字管理的新增分類、修改分類、刪除分類的功能
  2. 可以在單字管理的每個分類底下新增單字、修改單字、刪除單字
  3. 可以同時選擇並刪除多個單字

https://ithelp.ithome.com.tw/upload/images/20191012/20120331ZWRuGoEMAh.png

三、課堂內容

(一) 目標

  1. 實作編輯學生與修改學生的功能
  2. 隱藏下方DataGridView的StudentID,修改顯示的欄位名稱

https://ithelp.ithome.com.tw/upload/images/20191012/20120331jjsGtNR2pN.png

  1. 將學生資料封裝成實體物件

(二) 實作程式碼

  1. 實作編輯學生與修改學生的功能
/// <summary>
/// 編輯學生按紐事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void editStudentBtn_Click(object sender, EventArgs e)
{
    if (queryResultGrid.CurrentRow == null)
    {
        return;
    }

    // 判斷所有欄位是否已經輸入
    TextBox[] fields = { studentNameTextBox, studentUsernameTextBox};
    string errorMsg = fieldsIsEmpty(fields);
    if (!string.IsNullOrEmpty(errorMsg))
    {
        MessageBox.Show(errorMsg.ToString(), "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 判斷帳號是否已經存在
    if (usernameIsExists(studentUsernameTextBox.Text))
    {
        MessageBox.Show("帳號已經存在!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }

    // 修改學生資料
    Student student = getStudentFromField();

    string sql = @"UPDATE Student
                   SET RealName = @RealName,
                       Birthdate = @Birthdate,
                       Username = @Username
                   WHERE StudentID = @StudentID";
    Dictionary<string, object> parameters = new Dictionary<string, object>()
    {
        {"RealName", student.RealName },
        {"Birthdate", student.Birthdate },
        {"Username", student.Username },
        {"StudentID", student.StudentID}
    };

    try
    {
        queryNoneReturn(sql, parameters);
        queryStudentBtn.PerformClick();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

/// <summary>
/// 刪除學生按紐事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void deleteStudentBtn_Click(object sender, EventArgs e)
{
    if (queryResultGrid.CurrentRow == null)
    {
        return;
    }

    Student student = getStudentFromField();

    string sql = @"DELETE
                   FROM Student
                   WHERE StudentID = @StudentID";
    Dictionary<string, object> parameters = new Dictionary<string, object>()
    {
        {"StudentID", student.StudentID }
    };

    try
    {
        queryNoneReturn(sql, parameters);
        queryStudentBtn.PerformClick();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
  1. 隱藏下方DataGridView的StudentID,修改顯示的欄位名稱
/// <summary>
/// 取得所有學生資料的按鈕事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void queryStudentBtn_Click(object sender, EventArgs e)
{
    try
    {
        string sql = @"SELECT StudentID,
                              RealName,
                              Username,
                              CAST(Birthdate AS DATE) AS Birthdate
                       FROM Student";

        queryResultGrid.DataSource = queryDT(sql, new Dictionary<string, object>());

        queryResultGrid.Columns["RealName"].HeaderText = "姓名";
        queryResultGrid.Columns["Username"].HeaderText = "帳號";
        queryResultGrid.Columns["Birthdate"].HeaderText = "生日";
        queryResultGrid.Columns["StudentID"].Visible = false;

        queryResultGrid.ClearSelection();
        studentNameTextBox.Text = studentUsernameTextBox.Text = studentPasswordTextBox.Text = "";

        insertStudentBtn.Enabled = editStudentBtn.Enabled = deleteStudentBtn.Enabled = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
  1. 將學生資料封裝成實體物件
public class Student
{
    /// <summary>
    /// 學生資料ID
    /// </summary>
    public string StudentID;

    /// <summary>
    /// 姓名
    /// </summary>
    public string RealName;

    /// <summary>
    /// 生日
    /// </summary>
    public DateTime Birthdate;

    /// <summary>
    /// 帳號
    /// </summary>
    public string Username;

    /// <summary>
    /// 密碼
    /// </summary>
    public string Password;
}

(三) 認識實體:以物件的觀點看資料

以英文單字測驗為例,共有四個實體

  1. 學生資料 (Student)
  2. 分類資料 (Category)
  3. 單字資料 (Vocabulary)
  4. 測驗資料 (Exam_Master & Exam_Detail)
  • 以資料庫的角度,每一列資料代表一個學生,每一個學生都有「姓名」、「生日」、「帳號」、「密碼」、「流水號」
  • 以程式的角度,每一個物件代表一個學生。

將學生資料以物件的表達方式,我們稱為「實體(Entity)」

An entity is any object in the system that we want to model and store information about. Entities are usually recognizable concepts, either concrete or abstract, such as person, places, things, or events which have relevance to the database.

到目前為止,我們實作的所有學生管理的功能都是以Raw SQL (原始SQL) 操作資料庫
除了使用Raw SQL處理資料,另一個以資料實體處理資料的寫法,稱之為ORM。


上一篇
第二十五堂:英文單字測驗程式 - 學生帳號資料管理(4) - 新增學生帳號 (Transcation、雜湊)
下一篇
第二十七堂:英文單字測驗程式 - 學生帳號資料管理(6) - 物件實體操作資料 (ORM、Entity Framework)
系列文
從問題理解與活用SQL語法30

尚未有邦友留言

立即登入留言