Lập trình Windows Chương 5.4. Truy vấn có tham số

1

Nội dung

• Nhu cầu cần có truy vấn có tham số

• Các bước tạo truy vấn có tham số

• Gọi Stored Procedure

2

Nhu cầu cần có truy vấn có tham số

• Tìm kiếm các dòng dữ liệu trong CSDL theo một điều kiện nào đó

do người dùng nhập vào

• Ví dụ: Tìm kiếm xem nhân viên có trong CSDL để cho phép đăng

nhập vào chương trình

string strUser, strPass; strUser = txtUser.Text; strPass = txtPass.Text;

string strSQL; strSQL = "select * from NhanVien where " + "username='" + strUser + "' and " + "password='" + strPass + "'";

3

Nhu cầu cần có truy vấn có tham số

• Những vị trí lệnh SQL cần dữ liệu người dùng (parameter

placeholders)

• Bất kỳ dữ liệu gì được truyền vào tham số sẽ được đối xử như

là dữ liệu thuần túy (không phải là 1 câu lệnh SQL)

4

Các bước tạo truy vấn có tham số

• Bước 1: Xây dựng câu SQL có tham số

• Bước 2: Khai báo đối tượng SqlParameter, gán giá trị tương ứng

• Bước 3: Gán đối tượng SqlParameter cho thuộc tính Parameters

của đối tượng SqlCommand

5

Các bước tạo truy vấn có tham số

• Bước 1:Xây dựng văn bản câu SQL có tham số

placeholder

• Những nơi cần dữ liệu người dùng chúng ta tạo một parameter

• Tên parameter placeholder: @ten

Parameter placeholder

§Cú pháp:

strSQL = "select … where cot1 = @ten1 …"

§Ví dụ:

strSQL = "select * from NhanVien where " + “manv=@user and matkhau=@pass";

6

Các bước tạo truy vấn có tham số

• Bước 2: Khai báo đối tượng SqlParameter, gán giá trị tương

ứng

SqlParameter

• Mỗi parameter placeholder tương ứng với một đối tượng

§Cú pháp:

SqlParameter param;

param = new SqlParameter(); param = new SqlParameter(string paramName, object value); param = new SqlParameter(string paramName, SqlDbType dbType); param = new SqlParameter(string paramName, SqlDbType dbType, int size);

7

Các bước tạo truy vấn có tham số

• Một số loại kiểu dữ liệu của tham số: SqlDbType

• Chuỗi

• TinyInt = Byte

• SmallInt = Int16

Int = Int32

• BigInt = Int64

• Real = Single

• Float = Double

– Char = String – NChar = String – Text = String – NText = String – NVarChar = String

• Decimal = Decimal

• Money = Decimal

• Kiểu khác

• Số

– Bit = Boolean – DateTime = DateTime

8

Các bước tạo truy vấn có tham số

• Một số property của SqlParameter

• string param.ParameterName

• SqlDbType param.SqlDbType

• object param.Value

• int param.Size

9

Các bước tạo truy vấn có tham số

• Ví dụ

SqlParameter paramMaNV, paramMatKhau;

paramMaNV = new SqlParameter(); paramMaNV.SqlDbType = SqlDbType.VarChar; paramMaNV.ParameterName = "@user"; paramMaNV.Value = strMaNV;

paramMatKhau = new SqlParameter(); paramMatKhau.SqlDbType = SqlDbType.VarChar; paramMatKhau.ParameterName = "@pass"; paramMatKhau.Value = strMatKhau;

10

Các bước tạo truy vấn có tham số

• Bước 3: Gán đối tượng SqlParameter cho thuộc tính

Parameters của đối tượng SqlCommand

SqlCommand cmd; SqlParameter param; … cmd.Parameters.Add(param); cmd.Parameters.Add(string paramName, SqlDbType dbType); cmd.Parameters.Add(string paramName, SqlDbType dbType, int size);

11

Gọi Stored Procedure

• Khái niệm Stored Procedure – SP

• Tạo Stored Procedure

• Gọi SP không có tham số

• Gọi SP có tham số input (vào)

• Gọi SP có tham số output (ra)

12

Gọi Stored Procedure Khái niệm Stored Procedure

• SP là 1 thủ tục được định nghĩa trước và được lưu trữ trong

CSDL để người dùng sẵn sàng dùng

• Đặc điểm của SP

• SQL Server biên dịch Stored Procedure

• Gọi SP chạy sẽ nhanh hơn việc xây dựng câu truy vấn trong code

• SP bảo mật hơn

13

Gọi Stored Procedure Tạo Stored Procedure – SP

• Cú pháp tạo SP

CREATE PROCEDURE usp_TenSP /* ( @parameter1 datatype = defaultvalue, @parameter2 datatype OUTPUT ) */ AS /* SET NOCOUNT ON */ RETURN

14

Gọi Stored Procedure Gọi SP không có tham số

• 2 bước gọi SP không tham số:

Command

• Bước 1: Chỉ rõ tên SP trong thuộc tính CommandText của đối tượng

SqlCommand cmd; … cmd.CommandText = “usp_TenStoredProcedure”

• Bước 2: Chỉ cho đối tượng Command biết chúng ta đang muốn thực thi 1 Stored Procedure

cmd.CommandType = CommandType.StoredProcedure

15

Gọi Stored Procedure Gọi SP không có tham số

• Ví dụ:

create procedure usp_LayDSNhanVien as

select * from NhanVien return

string strSP = “usp_LayDSNhanVien”; SqlCommand cmd = new SqlCommand(strSP, conn); cmd.CommandType = CommandType.StoredProcedure;

SqlDataAdapter daNhanVien = new SqlDataAdapter(cmd); DataTable dtNhanVien = new DataTable(); daNhanVien.Fill(dtNhanVien);

// Cách 2 //conn.Open(); //SqlDataReader dr = cmd.ExecuteReader();

16

Gọi Stored Procedure Gọi SP có tham số input (vào)

• 3 bước gọi SP có tham số input:

• Bước 1, 2: giống như trước

command (Tên tham số giống tên tham số trong SP)

• Bước 3: Thêm đối tượng tham số SqlParameter vào đối tượng

cmd.Parameters.Add(“@TenThamSo”, kieu, kichthuoc); cmd.Parameters[“@TenThamSo”].value = giatri;

17

Gọi Stored Procedure Gọi SP có tham số input (vào)

• Ví dụ:

create procedure usp_TimNhanVienTheoTen

(@ten nvarchar(20))

as

select * from NhanVien where ten = @ten return

string sqlSP = "usp_TimNhanVienTheoTen";

conn = new SqlConnection(strConn);

SqlCommand cmd = new SqlCommand(sqlSP, conn); cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@Ten", SqlDbType.NVarChar, 20); cmd.Parameters["@Ten"].Value=giatri;

18

Gọi Stored Procedure Gọi SP có tham số output (ra)

• Tương tự SP có tham số input

Direction của đối tượng SqlParameter

• Nhưng bước 3 phải chỉ rõ tham số nào là output bằng thuộc tính

SqlParameter param; … param.Direction = ParameterDirection.Output

19

Gọi Stored Procedure Gọi SP có tham số output (ra)

• Ví dụ:

create procedure usp_TimTenNhanVienTheoMa

(@manv nvarchar(20), @ten nvarchar(20) output)

as

select @ten=ten from NhanVien where manv=@manv

return

20

Gọi Stored Procedure Gọi SP có tham số output (ra)

string sqlSP = "usp_TimTenNhanVienTheoMa";

conn = new SqlConnection(strConn); SqlCommand cmd = new SqlCommand(sqlSP, conn); cmd.CommandType = CommandType.StoredProcedure;

SqlParameter paramTen = new SqlParameter(); paramTen.Direction = ParameterDirection.Output; paramTen.ParameterName ="@ten"; paramTen.SqlDbType = SqlDbType.NVarChar; paramTen.Size = 20; cmd.Parameters.Add(paramTen);

cmd.Parameters.Add("@MaNV", SqlDbType.NVarChar, 20); cmd.Parameters["@MaNV"].Value = "NV001";

conn.Open(); cmd.ExecuteReader(); conn.Close(); string ten = cmd.Parameters["@ten"].Value.ToString();

21

Q&A

22 22