[ADO.NET Tutorial] Lesson 06: Thêm Parameter vào SqlCommand

Thảo luận trong 'C#.NET, Windows Form' bắt đầu bởi nhatlectv, 7/5/16.

  1. nhatlectv

    nhatlectv Stanford - Nâng tầm tri thức Thành viên BQT

    Giới thiệu

    Khi bạn làm việc với dữ liệu, bạn sẽ thường xuyên cần lọc kết quả dựa trên một vài điều kiện. Thông thường điều này được thực hiện bằng cách lấy dữ liệu nhập từ người dùng và tạo ra câu truy vấn SQL từ đó. Ví dụ, nhà kinh doanh cần xem tất cả hóa đơn trong một khoảng thời gian xác định. Hoặc một truy vấn khác có thể là lọc các khách hàng theo thành phố.

    Như bạn biết, câu truy vấn SQL được gán vào đối tượng SqlCommand chỉ là một chuỗi. Vì thế, nếu bạn muốn tạo một truy vấn lọc, bạn có thể tạo một chuỗi động, nhưng bạn không cần phải làm thế. Đây là một ví dụ tồi cho việc tạo một câu truy vấn lọc.

    // don’t ever do this!

    SqlCommand cmd = new SqlCommand(“select * from Customers where city = ‘” + inputCity + “‘”;

    Đừng bao giờ tạo một câu truy vấn theo cách trên! Biến chứa dữ liệu nhập, inputCity, chỉ đơn giản là lấy dữ liệu từ TextBox trên Windows form hoặc Web Page. Bất kì thứ gì trong TextBox sẽ được đặt vào inputCity và được thêm vào câu SQL của bạn. Cách làm này có thể bị hacker thay thế chuỗi này bằng những thứ gây hại (SQL Injection). Trong trường hợp xấu nhất, bạn có thể bị lấy toàn quyền điều khiển của máy tính.

    Thay vì tạo một chuỗi động, như bạn thấy ở ví dụ trên, hãy sử dụng parameter. Bất kì thứ gì được đặt vào một parameter sẽ được coi là một trường dữ liệu, không phải là một phần của câu lệnh SQL, điều này giúp ứng dụng của bạn an toàn hơn trong lập trình C#.

    [​IMG]

    (Mô hình kết hợp giữa SqlParameter và SqlCommand)

    Dùng câu truy vấn với parameter bao gồm ba bước sau:

    1. Tạo một SqlCommand từ một câu lệnh có parameter.

    2. Khai báo một đối tượng SqlParameter, gán giá trị thích hợp cho nó.

    3. Gán đối tượng SqlParameter vào property Parameters của đối tượng SqlCommand.

    Các phần sau hướng dẫn từng bước quá trình trên.

    Tạo một đối tượng SqlCommand sử dụng Parameter

    Bước đầu tiên là tạo một câu lệnh chứa các parameter placeholder (tên của parameter). Tên này sẽ được thay thế bởi giá trị thực sự của parameter khi SqlCommand thực thi. Cú pháp đúng của một parameter là dùng kí hiệu tiền tố ‘@’ trong tên của parameter như sau:

    // 1. declare command object with parameter

    SqlCommand cmd = new SqlCommand(“select * from Customers where city = @City”, conn);

    Trong constructor của SqlCommand trên, tham số đầu tiên chứa một khai báo parameter, @City. Ví dụ này dùng một parameter, nhưng bạn có thể có nhiều parameter tùy theo số lượng bạn cần để tạo cây truy vấn. Mỗi parameter sẽ so khớp với một đối tượng SqlParameter được gán vào đối tượng SqlCommand.

    Khai báo một đối tượng SqlParameter

    Mỗi parameter trong câu lệnh SQL phải được định nghĩa. Đây là mục đích của kiểu SqlParameter. Mã nguồn của bạn phải định nghĩa một đối tượng SqlParameter cho mỗi parameter trong câu lệnh SQL của đối tượng SqlCommand. Đoạn mã sau định nghĩa một SqlParameter cho parameter @City trong phần trước:

    // 2. define parameters used in command object

    SqlParameter param = new SqlParameter();

    param.ParameterName = “@City”;

    param.Value = inputCity;

    Lưu ý rằng property ParameterName của đối tượng SqlParameter phải được viết đúng với parameter được dùng trong câu lệnh SQL của SqlCommand. Bạn cũng phải xác định giá trị cho các parameter. Khi đối tượng SqlCommand được thực thi, parameter sẽ được thay thế bằng giá trị của nó.

    Kết hợp đối tượng SqlParameter với đối tượng SqlCommand

    Với mỗi parameter được định nghĩa trong câu lệnh SQL của đối tượng SqlCommand phải được định nghĩa một SqlParameter. Bạn cũng phải để đối tượng SqlCommand biết về SqlParameter bằng cách gán đối tượng SqlParameter cho property Parameters của đối tượng SqlCommand. Dòng mã sau cho thấy cách làm điều này:

    // 3. add new parameter to command object

    cmd.Parameters.Add(param);

    Đối tượng SqlParameter là tham số trong phương thức Add() của property Parameters của đối tượng SqlCommand trên. Bạn phải thêm một SqlParameter duy nhất cho mỗi parameter đã định nghĩa trong câu lệnh SQL của đối tượng SqlCommand.

    Kết hợp tất cả lại

    Bạn đã biết cách dùng các đối tượng SqlCommand và SqlDataReader. Đoạn mã sau minh họa một chương trình làm việc sử dụng các đối tượng SqlParameter. Hiện tại, mọi thứ đã quen thuộc với bạn, ngoại trừ các phần được giới thiệu trong bài học này:

    Listing 1: Adding Parameters to Queries

    using System;

    using System.Data;

    using System.Data.SqlClient;

    class ParamDemo

    {

    static void Main()

    {

    // conn and reader declared outside try

    // block for visibility in finally block

    SqlConnection conn = null;

    SqlDataReader reader = null;

    string inputCity = "London";

    try

    {

    // instantiate and open connection

    conn = new

    SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");

    conn.Open();

    // don't ever do this!

    // SqlCommand cmd = new SqlCommand(

    // "select * from Customers where city = '" + inputCity + "'";

    // 1. declare command object with parameter

    SqlCommand cmd = new SqlCommand(

    "select * from Customers where city = @City", conn);

    // 2. define parameters used in command object

    SqlParameter param = new SqlParameter();

    param.ParameterName = "@City";

    param.Value = inputCity;

    // 3. add new parameter to command object

    cmd.Parameters.Add(param);

    // get data stream

    reader = cmd.ExecuteReader();

    // write each record

    while(reader.Read())

    {

    Console.WriteLine("{0}, {1}",

    reader["CompanyName"],

    reader["ContactName"]);

    }

    }

    finally

    {

    // close reader

    if (reader != null)

    {

    reader.Close();

    }

    // close connection

    if (conn != null)

    {

    conn.Close();

    }

    }

    }

    }

    Đoạn mã trong Listing 1 đơn giản là lấy các dòng dữ liệu của mỗi khách hàng sống tại London. Điều này giúp bảo mật hơn khi dùng parameter. Ngoài parameter, đoạn mã trên chỉ chứa các kĩ thuật mà bạn đã được học trong các bài trước.

    Tổng kết

    Bạn nên dùng parameter để tạo truy vấn lọc để tăng tính an toàn. Việc sử dụng parameter bao gồm 3 bước: định nghĩa parameter trong chuỗi lệnh của SqlCommand, khai báo đối tượng SqlParameter với các property tương ứng, và gán đối tượng SqlParameter cho đối tượng SqlCommand. Khi SqlCommand thực thi, các parameter sẽ được thay thế với giá trị của đối tượng SqlParameter.

    Tôi hi vọng bạn thích bài học về sử dụng SqlParameter trong lập trình cơ sở dữ liệu bằng ado.net trong c# này và mời bạn trở lại trong bài kế tiếp, Lesson 07: Sử dụng Stored Procedure.
     

Chia sẻ trang này