文件首頁
MySQL Connector/NET 開發人員指南
相關文件 下載本手冊
PDF (美式信紙) - 1.3Mb
PDF (A4) - 1.3Mb


6.1.4 使用參數

本教學課程的這一部分將說明如何在 MySQL Connector/NET 應用程式中使用參數。

雖然可以直接從使用者輸入建立 SQL 查詢字串,但不建議這樣做,因為這樣無法防止輸入錯誤或惡意資訊。使用參數會更安全,因為它們只會被當作欄位資料來處理。例如,想像一下以下查詢是從使用者輸入建立的

string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = "+user_continent;

如果字串 user_continent 來自 Text Box 控制項,則使用者輸入的字串可能無法受到控制。使用者可能會輸入產生執行階段錯誤的字串,或者在最壞的情況下實際損害系統。當使用參數時,不可能這樣做,因為參數永遠只會被當作欄位參數,而不是任意的 SQL 程式碼。

使用參數進行使用者輸入的相同查詢為

string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
注意

參數前面會加上 '@' 符號,表示它將被當作參數處理。

除了標記查詢字串中參數的位置之外,還必須將參數加入 MySqlCommand 物件中。以下程式碼片段說明了這一點

cmd.Parameters.AddWithValue("@Continent", "North America");

在此範例中,字串「北美洲」是靜態地作為參數值提供的,但在更實際的範例中,它會來自使用者輸入控制項。

以下範例說明了完整的流程

using System;
using System.Data;

using MySql.Data;
using MySql.Data.MySqlClient;

public class Tutorial5
{
    public static void Main()
    {
        string connStr = "server=localhost;user=root;database=world;port=3306;password=******";
        MySqlConnection conn = new MySqlConnection(connStr);
        try
        {
            Console.WriteLine("Connecting to MySQL...");
            conn.Open();

            string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent";
            MySqlCommand cmd = new MySqlCommand(sql, conn);

            Console.WriteLine("Enter a continent e.g. 'North America', 'Europe': ");
            string user_input = Console.ReadLine();

            cmd.Parameters.AddWithValue("@Continent", user_input);

            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                Console.WriteLine(rdr["Name"]+" --- "+rdr["HeadOfState"]);
            }
            rdr.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }

        conn.Close();
        Console.WriteLine("Done.");
    }
}

在本教學課程的這一部分,您已了解如何使用參數來讓您的程式碼更安全。