Home > Lập trình > Sử dụng tham số trong SqlCommand

Sử dụng tham số trong SqlCommand


Tạo 1 cơ sở dữ liệu đơn giản như sơ đồ bên dưới:thamso-1

Giả sử cần lọc ra những học sinh thuộc lớp TH01 và có ngày sinh sau ngày 5/8/1990. Theo cách thông thường, chuỗi truy vấn sẽ như sau:

SELECT * FROM tbHocsinh WHERE malop='TH01' AND ngaysinh > '1990-08-05'

hoặc

SELECT * FROM tbHocsinh WHERE malop='TH01' AND ngaysinh > CONVERT(datetime,'5/8/1990', 103)

Không nên tạo chuỗi truy vấn theo cách này.

Nó có 1 số bất tiện sau:

  1. Làm việc với kiểu ngày tháng luôn luôn rất khó chịu, do có rất nhiều kiểu định dạng. Điều kiện ngày tháng ở trên có dạng năm-tháng-ngày, hoặc bạn phải dùng lệnh CONVERT. Giả sử như bạn không nhớ cú pháp này thì sao? Phát sinh lỗi, hoặc lấy sai dữ liệu. Sử dụng Paramater sẽ khắc phục được rắc rối này.
  2. Trong ví dụ trên, nếu mã lớp được lấy từ 1 textbox, ứng dụng có thể bị lỗi SQL Injection. (tham khảo http://vi.wikipedia.org/wiki/SQL_injection)

Và còn nhiều nhược điểm khác, bạn có thể tìm hiểu thêm trên mạng.

Bây giờ Mở Visual Studio và thiết kế Form như hình sau, bao gồm 2 label, 1 textbox để lấy mã lớp, 1 DateTimePicker và 1 DataGridview.

thamso-2

Viết hàm lấy danh sách học sinh, trả về kiểu DataTable, hàm gồm 2 tham số:

  • malop: kiểu string, là mã lớp cần lọc
  • ngaysinh: kiểu DateTime, sẽ lọc những học sinh có ngày sinh lớn hơn ngày này

Nội dung hàm như sau:

thamso-3

Có một số điểm cần lưu ý sau:

1/ Tên tham số trong câu truy vấn: tại dòng 24, mỗi tham số đều cần 1 cái tên và bắt đầu bằng kí tự @. Trong ví dụ trên là @p_malop@p_ngaysinh.

2/ Thêm tham số, kiểu dữ liệu và giá trị vào SqlCommand

Trong chuỗi SelectSQL, ta đã sử dụng 2 tham số @p_malop @p_ngaysinh . Khi xây dụng SqlComamnd dựa vào chuỗi SelectSQL, ta cần thêm 2 tham số này cùng với kiểu dữ liệu và giá trị của nó vào SqlCommand như 2 dòng 33 và 34


cmd.Parameters.Add("@p_malop", SqlDbType.Char, malop.Length).Value = malop;
cmd.Parameters.Add("@p_ngaysinh", SqlDbType.Date).Value = ngaysinh;

SqlDbType.CharSqlDbType.Date là kiểu dữ liệu của 2 tham số (kiểu bên SQL chứ không phải C#)
Tham số thứ 3 (malop.Length) là chiều dài của tham số, tham số tùy chọn, không có cũng không sao.
Trong trường hợp bạn không xác định được kiểu dữ liệu SQL của 1 tham số, bạn cũng có thể viết lại 2 lệnh trên như sau:

cmd.Parameters.AddWithValue("@p_malop", malop);
cmd.Parameters.AddWithValue("@p_ngaysinh", ngaysinh);

Nếu cần nhập tham số ngày tháng từ 3 giá trị ngày, tháng, năm cụ thể, ví dụ ngày 5 tháng 8 năm 1990, ta có thể viết:


cmd.Parameters.Add("@p_ngaysinh", SqlDbType.Date).Value = new DateTime(1990, 8, 5);

Việc sử dụng tham số trong SqlCommand cũng không quá phức tạp nhưng có thể khắc phục được rất nhiều bất tiện, dồng thời cũng tăng tính bảo mật của chương trình.

Bạn có thể download ứng dụng mẫu, viết bằng Visual 2010 tại đây.

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: