iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
1
Software Development

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

第二十三堂:英文單字測驗程式 - 學生帳號資料管理(2) - 取得指定的學生 (Bind SQL Parameter)

  • 分享至 

  • xImage
  •  

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

今天的Playground範例程式碼與範本資料SQL以更新至Github
https://github.com/ted59438/EnglishVocabulary_MySQL

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

二、今日作業

在「單字管理」選擇某項分類時,會將分類底下所有的單字帶入下方Grid
注意查詢的時候必須使用所有欄位,但是下方欄位只能顯示「單字、中文、詞性」。
https://ithelp.ithome.com.tw/upload/images/20191009/20120331PJYYrLgFwU.png

三、課堂內容

SQL參數化寫法(Bind Parameter)

(一) 目的

將外部資料透過參數化的方式加到SQL語句,避免SQL Injection

(二) 實作程式碼:查詢特定學生

https://ithelp.ithome.com.tw/upload/images/20191009/20120331yvX98tccID.png

/// <summary>
///  基本查詢
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private DataTable queryDT(string sql, Dictionary<string, object> parameters)
{
    // Step 1. 建立連線物件 (SqlConnection)
    MySqlConnection connection = new MySqlConnection();
    connection.ConnectionString = getConnectString();

    // Step 2. 建立指令物件,設定SQL語法 (SqlCommand)
    MySqlCommand command = new MySqlCommand();
    command.Connection = connection;
    command.CommandText = sql;

    // 將參數綁定到語法上
    foreach (KeyValuePair<string, object> parameter in parameters)
    {
        command.Parameters.AddWithValue(parameter.Key, parameter.Value);
    }


    // Step 3. 建立撈取資料的物件 (Adapter)
    MySqlDataAdapter adapter = new MySqlDataAdapter();
    adapter.SelectCommand = command;

    // Step 4. 開啟連線 
    connection.Open();

    // Step 5. 執行SELECT查詢,取得資料後存放到DataTable
    DataTable queryResultDT = new DataTable();
    adapter.Fill(queryResultDT);

    // Step 6. 關閉連線
    connection.Close();

    return queryResultDT;
}

/// <summary>
/// 取得特定學生的資料
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void queryOneStudentBtn_Click(object sender, EventArgs e)
{
    // 撰寫查詢語句
    string sql = @"SELECT *
                   FROM Student
                   WHERE StudentID = @StudentID";
    
    // 要放到SQL的參數
    Dictionary<string, object> parameters = new Dictionary<string, object>()
    {
        {"StudentID", selectStudentCombo.SelectedValue }
    };

    queryResultGrid.DataSource = queryDT(sql, parameters);
}

(三) 綁定參數的方式

  1. 設定要查詢的SQL語句到Command物件,要綁定的參數以「@參數名稱」表示
  2. 將要綁定上去的參數值綁定到對應的參數名稱

// 設定要查詢的SQL語句
command.CommandText = sql;

// 將參數綁定到語法上
foreach (KeyValuePair<string, object> parameter in parameters)
{
    command.Parameters.AddWithValue(parameter.Key, parameter.Value);
}

例如,綁定ID=123的學生:

string sql = @"SELECT *
               FROM Student
               WHERE StudentID = @StudentID";

Dictionary<string, object> parameters = new Dictionary<string, object>()
{
    {"StudentID", "123" }
};

綁定完後的SQL

SELECT *
FROM Student
WHERE StudentID = '123'

上一篇
第二十二堂:英文單字測驗程式 - 學生帳號資料管理(1) - 取得所有學生資料 (Command物件、Adapter物件)
下一篇
第二十四堂:英文單字測驗程式 - 學生帳號資料管理(3) - 學生帳號是否已經存在資料庫 (ExecuteScalar 取得單一值)
系列文
從問題理解與活用SQL語法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言