02 chuong 2 - lay du lieu theo cach connected

44
LẤY DỮ LIỆU THEO CÁCH CONNECTED Chương 2

description

chương 2 ado.net

Transcript of 02 chuong 2 - lay du lieu theo cach connected

Page 1: 02   chuong 2 - lay du lieu theo cach connected

LẤY DỮ LIỆU THEO CÁCH CONNECTED

Chương 2

Page 2: 02   chuong 2 - lay du lieu theo cach connected

2

Nội dung

Các bước lấy dữ liệu Lấy 1 giá trị đơn Lấy tập giá trị Truy vấn tập giá trị và lưu lại

Truy vấn có tham số Gọi Store Procedure

Page 3: 02   chuong 2 - lay du lieu theo cach connected

3

Page 4: 02   chuong 2 - lay du lieu theo cach connected

4

Page 5: 02   chuong 2 - lay du lieu theo cach connected

5

Page 6: 02   chuong 2 - lay du lieu theo cach connected

6

Các bước lấy dữ liệu

3 bước cơ bản • Bước 1: Chỉ rõ dữ liệu mà ứng dụng cần

– Viết yêu cầu bằng câu lệnh SQL– SQL:

Select DML, DDL, DCL

• Bước 2: Gởi yêu cầu đến CSDL– Tạo đối tượng Command

• Bước 3: Nhận kết quả

Page 7: 02   chuong 2 - lay du lieu theo cach connected

7

Lấy 1 giá trị đơn

Một số câu lệnh SQL trả về giá trị đơn

Tạo đối tượng Command

Cung cấp văn bản câu lệnh SQL cho Command

Thực thi câu lệnh

Page 8: 02   chuong 2 - lay du lieu theo cach connected

8

Lấy 1 giá trị đơnMột số câu lệnh SQL trả về giá trị đơn

Select min(…) From … Select max(…) From … Select avg(…) From … Select count(…) From … Select sum(…) From …

string strSQL = "Select count(*) From TenBang";

Page 9: 02   chuong 2 - lay du lieu theo cach connected

9

Lấy 1 giá trị đơnTạo đối tượng Command

Một đối tượng Command cần 3 thông tin• Đối tượng Connection

• Văn bản câu lệnh SQL

• Loại câu lệnh: CommadType– Lấy dữ liệu nguyên 1 Bảng: CommadType.TableDirect– Câu lệnh SQL: CommadType.Text– Stored Procedure: CommadType.StoredProcedure

Page 10: 02   chuong 2 - lay du lieu theo cach connected

10

Lấy 1 giá trị đơnTạo đối tượng Command

Cách 1:SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = strSQL;cmd.CommandType = CommandType.Text;

Cách 2:SqlCommand cmd = new SqlCommand(strSQL);cmd.Connection = conn;cmd.CommandType = CommandType.Text;

Page 11: 02   chuong 2 - lay du lieu theo cach connected

11

Lấy 1 giá trị đơnTạo đối tượng Command

Cách 3:SqlCommand cmd = new SqlCommand(strSQL, conn);cmd.CommandType = CommandType.Text;

Cách 4:SqlCommand cmd = conn.CreateCommand();cmd.CommandText = strSQL;cmd.CommandType = CommandType.Text;

Page 12: 02   chuong 2 - lay du lieu theo cach connected

12

Lấy 1 giá trị đơnThực thi câu lệnh

Phương thức ExecuteScalar()• ExecuteScalar trả về 1 giá trị kiểu object

• Dùng ép kiểu để chuyển sang kiểu dữ liệu tương ứng

Chú ý: Phải mở kết nối trước khi gọi lệnh ExecuteScalar

conn.Open();kq = (Kieu)cmd.ExecuteScalar();conn.Close();

Page 13: 02   chuong 2 - lay du lieu theo cach connected

13

Lấy tập giá trị

Câu lệnh SQL trả về tập giá trị Thực thi câu lệnh Đối tượng IDataReader Thuộc tính và phương thức của IDataReader

Page 14: 02   chuong 2 - lay du lieu theo cach connected

14

Lấy tập giá trịCâu lệnh SQL trả về tập giá trị

Tập giá trị: Gồm nhiều dòng hoặc nhiều cột

Select cột1, cột2, … From …

string strSQL = "Select cot1, … From TenBang";

Page 15: 02   chuong 2 - lay du lieu theo cach connected

15

Lấy tập giá trịThực thi câu lệnh

Phương thức ExecuteReader()• ExecuteScalar trả về 1 đối tượng IDataReader

(SqlDataReader hay OleDBDataReader)

• IDataReader cho phép chúng ta duyệt qua các dòng trong tập dữ liệu

Chú ý: • Phải mở kết nối trước khi gọi lệnh ExecuteReader

• Không được đóng kết nối khi còn đang sử dụng đối tượng IDataReader

conn.Open();SqlDataReader reader=cmd.ExecuteReader();

…conn.Close();

Page 16: 02   chuong 2 - lay du lieu theo cach connected

16

Lấy tập giá trịĐối tượng IDataReader

Đặc điểm của đối tượng IDataReader• Chứa một luồng dữ liệu, tại mỗi thời điểm chỉ

truy cập 1 dòng

• Read-only, Forward-only

Page 17: 02   chuong 2 - lay du lieu theo cach connected

17

Lấy tập giá trịThuộc tính và phương thức của IDataReader

Get[DataType](int i): GetInt32(…), GetString(…), …• Tên đầy đủ: phụ thuộc vào kiểu dữ liệu cần lấy

• Tham số của hàm: là số thứ tự của cột (Ordinal) muốn lấy dữ liệu

string GetName(int i)• Lấy tên cột có số thứ tự i

int GetOrdinal(string name)• Lấy số thứ tự của cột có tên name

bool IsDbNull(int i)• Kiểm tra giá trị cột I có là null/nothing hay không

Page 18: 02   chuong 2 - lay du lieu theo cach connected

18

Lấy tập giá trịThuộc tính và phương thức của IDataReader

object GetValue(int i)• Lấy giá trị cột I mà không quan tâm kiểu dữ liệu

Hai indexer có chức năng tương tự phương thức GetValue• object dataReader[int i]

• object dataReader[string name]

Chú ý: Nên dùng số thứ tự thay vì tên cột

Page 19: 02   chuong 2 - lay du lieu theo cach connected

19

Lấy tập giá trịThuộc tính và phương thức của IDataReader

bool HasRow• true: cho biết IDataReader chứa 1 hay nhiều

dòng dữ liệu

bool Read()• Đọc dòng kế tiếp

• Trả về true nếu còn 1 hay nhiều dòng dữ liệu

Page 20: 02   chuong 2 - lay du lieu theo cach connected

20

Lấy tập giá trịThuộc tính và phương thức của IDataReader

conn.Open();SqlDataReader reader=cmd.ExecuteReader();

if (!reader.HasRows)

while (reader.Read()){

value1 = reader.GetString(0);value2 = reader.GetInt32(1);

}conn.Close();

Page 21: 02   chuong 2 - lay du lieu theo cach connected

21

Truy vấn tập giá trị và lưu lại

Điều kiện lưu dữ liệu vào bộ nhớ• Trong một số trường hợp cần lưu dữ liệu

– Data-binding– Cần nhiều thời gian để xử lý dữ liệu

Cần lưu dữ liệu lại để xử lý sau

Page 22: 02   chuong 2 - lay du lieu theo cach connected

22

Truy vấn tập giá trị và lưu lại

Dùng vòng lặp foreach • Để lặp qua các dòng dữ liệu

• Mỗi dòng dữ liệu được gọi là DbDataRecordList<NhanVien> nhanVienList = new List<NhanVien>();

conn.Open();SqlDataReader reader=cmd.ExecuteReader();

foreach (DbDataRecord rec in reader) {

nhanVienList.Add(new NhanVien(rec));}conn.Close();

//Sử dụng nhanVienList

Page 23: 02   chuong 2 - lay du lieu theo cach connected

23

TRUY VẤN CÓ THAM SỐ

Page 24: 02   chuong 2 - lay du lieu theo cach connected

24

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

Chúng ta thường viết các câu lệnh SQL đề tìm kiếm các dòng dữ liệu trong CSDL theo một điều kiện nào đó. Những giá trị trong điều kiện do người dùng nhập vào

Ví dụ: Tìm kiếm nhân viên có trong CSDL không để 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 + "'";

Page 25: 02   chuong 2 - lay du lieu theo cach connected

25

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

Nhận xét• Bất kỳ những gì nhập vào txtPass, txtUser đều

được đặt vào trong câu SQL

• Hãy nhập vào username: ' or ('1'='1') or '1'='1 hay

• Hãy nhập vào password: ' or '1'='1

Page 26: 02   chuong 2 - lay du lieu theo cach connected

26

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

Truy vấn có tham số• Những nơi trong câu SQL cần dữ liệu người

dùng, chúng ta sẽ tạo những tham số tại những nơi đó (gọi là 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)

Page 27: 02   chuong 2 - lay du lieu theo cach connected

27

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

3 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ố

• 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

Page 28: 02   chuong 2 - lay du lieu theo cach connected

28

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ố• Những nơi cần dữ liệu người dùng chúng ta tạo

một parameter placeholder

• Tên parameter placeholder: @ten

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

Ví dụ:

Cú pháp:

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

Parameter placeholder

Page 29: 02   chuong 2 - lay du lieu theo cach connected

29

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• Mỗi parameter placeholder tương ứng với một

đối tượng SqlParameter

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);

Cú pháp:

Page 30: 02   chuong 2 - lay du lieu theo cach connected

30

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• Số

– TinyInt = Byte– SmallInt = Int16– Int = Int32– BigInt = Int64– Real = Single– Float = Double– Decimal = Decimal– Money = Decimal

• Chuỗi– Char = String– NChar = String– Text = String– NText = String– NVarChar = String

• Kiểu khác– Bit = Boolean– DateTime = DateTime

Page 31: 02   chuong 2 - lay du lieu theo cach connected

31

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

Page 32: 02   chuong 2 - lay du lieu theo cach connected

32

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;

Page 33: 02   chuong 2 - lay du lieu theo cach connected

33

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);

Page 34: 02   chuong 2 - lay du lieu theo cach connected

34

GỌI STORED PROCEDURE

Page 35: 02   chuong 2 - lay du lieu theo cach connected

35

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

Định nghĩa Stored Procedure – SP:• 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

Page 36: 02   chuong 2 - lay du lieu theo cach connected

36

Gọi Stored ProcedureTạ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

Page 37: 02   chuong 2 - lay du lieu theo cach connected

37

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

2 bước gọi SP không tham số:• Bước 1: Chỉ rõ tên SP trong thuộc tính

CommandText của đối tượng Command

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

Page 38: 02   chuong 2 - lay du lieu theo cach connected

38

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

Ví dụ: create procedure usp_LayDSNhanVienas

select * from NhanVienreturn

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();

Page 39: 02   chuong 2 - lay du lieu theo cach connected

39

Gọi Stored ProcedureGọ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

• Bước 3: Thêm đối tượng tham số SqlParameter vào đối tượng command (Tên tham số giống tên tham số trong SP)

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

Page 40: 02   chuong 2 - lay du lieu theo cach connected

40

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

Ví dụ:

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;

create procedure usp_TimNhanVienTheoTen(@ten nvarchar(20))

asselect * from NhanVien where ten = @tenreturn

Page 41: 02   chuong 2 - lay du lieu theo cach connected

41

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

Tương tự SP có tham số input• Nhưng bước 3 phải chỉ rõ tham số nào là

output bằng thuộc tính Direction của đối tượng SqlParameter

SqlParameter param;…param.Direction = ParameterDirection.Output

Page 42: 02   chuong 2 - lay du lieu theo cach connected

42

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

Ví dụ:

create procedure usp_TimTenNhanVienTheoMa(@manv nvarchar(20), @ten nvarchar(20) output)

asselect @ten=tenfrom NhanVienwhere manv=@manv

return

Page 43: 02   chuong 2 - lay du lieu theo cach connected

43

Gọi Stored ProcedureGọ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();

Page 44: 02   chuong 2 - lay du lieu theo cach connected

44

Tóm tắt chương 2