LẤY DỮ LIỆU
THEO CÁCH CONNECTED
Chương 2
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
3
4
5
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ả
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
8
Lấy 1 giá trị đơn
Mộ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";
9
Lấy 1 giá trị đơn
Tạ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
10
Lấy 1 giá trị đơn
Tạ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;
11
Lấy 1 giá trị đơn
Tạ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;
12
Lấy 1 giá trị đơn
Thự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();
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
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";
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();
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
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
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
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
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();
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
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à DbDataRecord
List<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
…
23
TRUY VẤN CÓ THAM SỐ
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 + "'";
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