6.1.4 & nbsp; làm việc với các tham số
Phần này của hướng dẫn chỉ cho bạn cách sử dụng các tham số trong đầu nối MYSQL/ứng dụng ròng của bạn.
Mặc dù có thể xây dựng các chuỗi truy vấn SQL trực tiếp từ đầu vào của người dùng, nhưng điều này không được khuyến khích vì nó không ngăn chặn thông tin sai lầm hoặc độc hại được nhập. Sẽ an toàn hơn khi sử dụng các tham số vì chúng sẽ chỉ được xử lý dưới dạng dữ liệu trường. Ví dụ, hãy tưởng tượng truy vấn sau được xây dựng từ đầu vào của người dùng:
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = "+user_continent;
Nếu chuỗi user_continent
đến từ điều khiển hộp văn bản, có khả năng sẽ không có quyền kiểm soát chuỗi được nhập bởi người dùng. Người dùng có thể nhập một chuỗi tạo ra lỗi thời gian chạy hoặc trong trường hợp xấu nhất thực sự gây hại cho hệ thống. Khi sử dụng các tham số, không thể làm điều này vì một tham số chỉ được coi là một tham số trường, thay vì một đoạn mã SQL tùy ý.
Truy vấn tương tự được viết bằng tham số cho đầu vào của người dùng là:
string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
Ghi chú
Tham số được đi trước bởi một ký hiệu '@' để cho biết nó được coi là một tham số.
Cũng như đánh dấu vị trí của tham số trong chuỗi truy vấn, cần thêm một tham số vào đối tượng MySqlCommand
. Điều này được minh họa bằng đoạn mã sau:
cmd.Parameters.AddWithValue["@Continent", "North America"];
Trong ví dụ này, chuỗi "Bắc Mỹ" được cung cấp dưới dạng giá trị tham số một cách thống trị, nhưng trong một ví dụ thực tế hơn, nó sẽ đến từ điều khiển đầu vào của người dùng.
Một ví dụ khác minh họa quá trình hoàn chỉnh:
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."];
}
}
Trong phần này của hướng dẫn, bạn đã xem cách sử dụng các tham số để làm cho mã của bạn an toàn hơn.
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."];
}
}
5
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."];
}
}
Đối với các tham số chuỗi ký tự, tên đặt ký tự.
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."];
}
}
6Đối với các tham số chuỗi ký tự, tên đối chiếu.
9cmd.Parameters.AddWithValue["@Continent", "North America"];
user_continent
0user_continent
1 cho các thủ tục được lưu trữ,user_continent
2 cho các chức năng được lưu trữ.SQL tham số là gì?
Các tham số được sử dụng để trao đổi dữ liệu giữa các quy trình và chức năng được lưu trữ và ứng dụng hoặc công cụ được gọi là quy trình hoặc chức năng được lưu trữ: Các tham số đầu vào cho phép người gọi chuyển giá trị dữ liệu cho quy trình hoặc hàm được lưu trữ.
Cơ sở dữ liệu tham số là gì?
Các tham số cơ sở dữ liệu Chỉ định cách cấu hình cơ sở dữ liệu. Ví dụ: các tham số cơ sở dữ liệu có thể chỉ định lượng tài nguyên, chẳng hạn như bộ nhớ, để phân bổ cho cơ sở dữ liệu.
Giá trị
3 là 0.string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
Các giá trị
7 vàstring sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
8 làstring sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
9 vì giá trị trả về không có tên và chế độ không áp dụng.string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
8string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
Chế độ của tham số. Giá trị này là một trong
1,cmd.Parameters.AddWithValue["@Continent", "North America"];
2 hoặccmd.Parameters.AddWithValue["@Continent", "North America"];
3. Đối với giá trị trả về hàm được lưu trữ, giá trị này làcmd.Parameters.AddWithValue["@Continent", "North America"];
9.string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
7string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
Tên của thông số. Đối với giá trị trả về hàm được lưu trữ, giá trị này là
9.string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent";
7cmd.Parameters.AddWithValue["@Continent", "North America"];
Kiểu dữ liệu tham số.
Giá trị
7 chỉ là tên loại không có thông tin khác. Giá trịcmd.Parameters.AddWithValue["@Continent", "North America"];
9 chứa tên loại và có thể các thông tin khác như độ chính xác hoặc độ dài.cmd.Parameters.AddWithValue["@Continent", "North America"];
0using 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."]; } }
Đối với các tham số chuỗi, độ dài tối đa trong các ký tự.
1using 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."]; } }
Đối với các tham số chuỗi, độ dài tối đa tính bằng byte.
2using 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."]; } }
Đối với các tham số số, độ chính xác số.
3using 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."]; } }
Đối với các tham số số, thang đo số.
4using 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."]; } }
Đối với các tham số thời gian, độ chính xác của giây phân đoạn.
5using 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."]; } }
Đối với các tham số chuỗi ký tự, tên đặt ký tự.
6using 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."]; } }
Đối với các tham số chuỗi ký tự, tên đối chiếu.
9cmd.Parameters.AddWithValue["@Continent", "North America"];
Kiểu dữ liệu tham số.
Giá trị
7 chỉ là tên loại không có thông tin khác. Giá trịcmd.Parameters.AddWithValue["@Continent", "North America"];
9 chứa tên loại và có thể các thông tin khác như độ chính xác hoặc độ dài.cmd.Parameters.AddWithValue["@Continent", "North America"];
user_continent
0user_continent
1 cho các thủ tục được lưu trữ,user_continent
2 cho các chức năng được lưu trữ.