文档首页
MySQL Connector/NET 开发人员指南
相关文档 下载本手册
PDF (US Ltr) - 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 来自文本框控件,则可能无法控制用户输入的字符串。用户可以输入生成运行时错误的字符串,或者在最坏的情况下实际上损害系统。使用参数时,不可能这样做,因为参数始终仅被视为字段参数,而不是任意 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.");
    }
}

在本教程的这一部分中,您已经了解了如何使用参数来使代码更安全。