MySQL Connector/NET 版本注意事項
本教學課程的這一部分將說明如何在 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.");
}
}
在本教學課程的這一部分,您已了解如何使用參數來讓您的程式碼更安全。