Xem mẫu

  1. Chương 4: Quản lý dữ liệu với Microsoft SQL Server Thời lượng: 8 tiết Mục tiêu: - Hiểu được các đối tượng trong hệ quản trị CSDL Microsoft SQL Server, - Viết được các câu lệnh SQL theo yêu cầu, - Tạo, quản lý được một CSDL trong Microsoft SQL Server theo yêu cầu. 4.1. Các khái niệm về cơ sở dữ liệu trong MS SQL Server 4.1.1. Các khái niệm về cơ sở dữ liệu a) Cơ sở dữ liệu: Một cơ sở dữ liệu (CSDL - Database) là một được lưu trữ trong máy tính theo một quy định nhất định nhằm phục vụ cho nào đó. Ví dụ: CSDL phục vụ cho việc quản lý các chuyến bay của một hãng hàng không cung cấp các thông tin vế số hiệu chuyến bay, nơi xuất phát, nơi đến, số chỗ ngồi, ngày bay của tất cả các chuyến bay trong năm; CSDL phục vụ cho công tác quản lý đào tạo trong trường chứa các dữ liệu phản ánh thông tin về học sinh, giáo viên, môn học, phòng học,... b) Hệ quản trị cơ sở dữ liệu: Một hệ quản trị cơ sở dữ liệu (HQT CSDL - Database Management System) là phần mềm cho phép người dùng và cơ sở dữ liệu. Đồng thời HQT CSDL cung cấp một môi trường thuận lợi cho việc thông tin được lưu trữ trong cơ sở dữ liệu. Một số hệ quản trị cơ sở dữ liệu: Microsoft (MS) Visual Foxpro, MS Access, MS SQL Server, DB2, Oracle,... c) Hệ cơ sở dữ liệu: Một hệ cơ sở dữ liệu (Database System) là một hệ thống phần mềm nhằm quản lý CSDL của một hệ thống thông tin cụ thể nào đó. Như vậy các thành phần bên trong một hệ CSDL gồm có: chương trình, CSDL, HQT CSDL. Để vận hành hệ CSDL cần có một số lượng con người. d) Mô hình dữ liệu: Nền tảng của cấu trúc cơ sở dữ liệu là mô hình dữ liệu. Mô hình dữ liệu Trang 56
  2. được định nghĩa là một sưu tập các công cụ khái niệm dùng cho việc mô tả dữ liệu, các mối quan hệ dữ liệu, các ngữ nghĩa dữ liệu và các ràng buộc dữ liệu. Các mô hình dữ liệu phổ biến là: mạng, phân cấp, quan hệ, ER, hướng đối tượng. e) Mô hình dữ liệu quan hệ: Mô hình dữ liệu quan hệ là mô hình dữ liệu trong đó tất cả dữ liệu được tổ chức trong các bảng (Table) có mối quan hệ với nhau. Mỗi bảng bao gồm các cột (Field – trường, thuộc tính), các dòng (Record – bản ghi, bộ). 4.1.2. Khái niệm về cơ sở dữ liệu trong MS SQL Server MS SQL Server là HQT CSDL được phát triển để tạo và quản lý CSDL quan hệ. Một CSDL trong MS SQL Server chứa các đối tượng: Tables, Views, Procedures,… Tables trong MS SQL Server gồm các Table có quan hệ với nhau. Sau đây sẽ trình bày các khái niệm liên quan đến Tables. a) Bảng (Table): Bảng bao gồm: - Tên của bảng: xác định duy nhất; - Cấu trúc của bảng: tập hợp các cột; - Dữ liệu của bảng: tập hợp các dòng; b) Khóa chính của bảng (Primary Key): Mỗi bảng phải có một cột (hoặc tập các cột) mà giá trị của nó xác định duy nhất định duy nhất một dòng trong tập hợp các dòng của bảng. Cột đó (tập các cột đó) được chọn làm khóa chính. c) Mối quan hệ (Relationship): Mối quan hệ của bảng được thể hiện thông qua sự ràng buộc giá trị dữ liệu xuất hiện trong bảng này phải có xuất hiện trong bảng kia. MS SQL Server chỉ hỗ trợ mối quan hệ 1-1 và 1-n. d) Khóa ngoài (Foreign Key): Một cột (hoặc một tập các cột) trong một bảng mà giá trị của nó được xác định từ khóa chính của một bảng khác được gọi là khóa ngoài. 4.2. Ngôn ngữ SQL SQL (Structured Query Language) là ngôn ngữ được sử dụng cho các HQT CSDL. Ngôn ngữ SQL chuẩn được đưa ra bởi ANSI (Amerrican National Standards Institude) và ISO (International Standards Organnization) với phiên bản mới nhất hiện nay là phiên bản SQL-92 (phiên bản được đưa ra vào năm 1992). Mặc dù có nhiều ngôn ngữ khác nhau được đưa ra cho các HQT CSDL Trang 57
  3. quan hệ, SQL vẫn là ngôn ngữ được sử dụng rộng rãi hiện nay trong nhiều hệ thống CSDL thương mại như: Oracle, SQL Server, DB2, Microsoft Access, … Thông qua SQL, người sử dụng có thể dễ dàng định nghĩa được dữ liệu, thao tác với dữ liệu, … Mặt khác, đây là ngôn ngữ có tính khai báo nên nó dễ sử dụng và cũng vì vậy mà trở nên phổ biến. 4.2.1. Các câu lệnh SQL Câu lệnh Chức năng a) Thao tác dữ liệu SELECT Truy xuất dữ liệu INSERT Bổ sung dữ liệu UPDATE Cập nhật dữ liệu DELETE Xóa dữ liệu TRUNCATE Xóa toàn bộ dữ liệu trong bảng b) Định nghĩa dữ liệu CREATE TABLE Tạo bảng DROP TABLE Xóa bảng ALTER TABLE Sửa cấu trúc bảng CREATE FUNCTION Tạo hàm (do người sử dụng định nghĩa) ALTER FUNCTION Sửa đổi hàm DROP FUNCTION Xóa hàm CREATE TRIGGER Tạo trigger ALTER TRIGGER Sửa trigger DROP TRIGGER Xóa trigger 4.2.2. Kiểu dữ liệu Trang 58
  4. Tên kiểu Mô tả CHAR (n) Kiểu chuỗi với độ dài cố định NCHAR (n) Kiếu chuỗi với độ dài cố định hỗ trợ UNICODE VARCHAR (n) Kiểu chuỗi với độ dài chính xác NVARCHAR (n) Kiểu chuỗi với độ dài chính xác hỗ trợ UNICODE INTEGER Số nguyên có giá trị từ -231 đến 231 - 1 INT Như kiểu Integer TINYTINT Số nguyên có giá trị từ 0 đến 255 SMALLINT Số nguyên có giá trị từ -215 đến 215 – 1 BIGINT Số nguyên có giá trị từ -263 đến 263 – 1 NUMERIC (p,s) Kiểu số với độ chính xác cố định DECIMAL (p,s) Tương tự kiểu Numeric FLOAT Số thực có giá trị từ -1.79E+308 đến 1.79E+308 REAL Số thực có giá trị từ -3.40E + 38 đến 3.40E + 38 MONEY Kiểu tiền tệ BIT Kiểu bit (có giá trị 0 hoặc 1) DATETIME Kiểu ngày giờ (chính xác đến phần trăm của giây) SMALLDATETIME Kiểu ngày giờ (chính xác đến phút) BINARY Dữ liệu nhị phân với độ dài cố định (tối đa 8000 bytes) VARBINARY Dữ liệu nhị phân với độ dài chính xác (tối đa 8000 bytes) IMAGE Dữ liệu nhị phân với độ dài chính xác (
  5. 2,147,483,647 bytes) TEXT Dữ liệu kiếu chuỗi với độ dài lớn (tối đa 2,147,483,647 ký tự) NTEXT Dữ liệu kiếu chuỗi với độ dài lớn và hỗ trợ UNICODE (tối đa 1,073,741,823 ký tự) 4.2.3. Toán tử Toán tử Ý nghĩa a) Logic: AND / OR Và / Hoặc b) So sánh: = Bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng < Nhỏ hơn hoặc bằng Khác !> Không lớn hơn !< Không nhỏ hơn c) Danh sách: IN Nằm trong danh sách NOT IN Không nằm trong danh sách d) Giới hạn dữ liệu: BETWEEN Giá trị BETWEEN a AND b nghĩa là (a ≤ Giá trị ≤ b) Trang 60
  6. NOT BETWEEN Giá trị NOT BETWEEN a AND b nghĩa là (Giá_trị < a) AND (Giá trị > b) LIKE Mô tả khuôn dạng dữ liệu cần tìm kiếm có sử dụng ký tự đại diện: % : Chuỗi ký tự bất kỳ _ : Một ký tự bất kỳ [] : Ký tự bất kỳ trong giới hạn được chỉ định [^] : Ký tự bất kỳ không nằm trong giới hạn được chỉ định 4.2.4. Một số hàm thường dùng Tên hàm Công dụng a) Ngày (Date: ngày/tháng/năm): GetDate() Lấy ngày hiện tại Day(Date) Lấy ngày trong tháng của một ngày Month(Date) Lấy tháng trong năm của một ngày Year(Date) Lấy năm của một ngày b) Chuỗi (string: chuỗi; m, n: độ dài): Left(string, n) Trích từ chuỗi string n ký tự từ trái sang Right(string, n) Trích từ chuỗi string n ký tự từ phải sang Substring(string, m, n) Trích từ chuỗi string n ký tự từ vị trí m Ltrim(string) Cắt bỏ khoảng trắng thừa bên trái chuỗi string Rtrim(string) Cắt bỏ khoảng trắng thừa bên phải chuỗi string Len(string) Độ dài chuỗi string Trang 61
  7. 4.2.5. Các câu lệnh SQL thường dùng Để thuận tiện cho việc minh họa các lệnh SQL, bài giảng đưa ra CSDL mẫu như Hình 4-1: LOP SINHVIEN # malop # masv tenlop tensv tengvcn ngaysinh magvcn quequan malop Hình 4-1 Mô hình dữ liệu mẫu a) Câu lệnh Insert: Cú pháp: INSERT INTO VALUES (danh sách giá trị) Ví dụ: Bổ sung thêm một sinh viên vào bảng SINHVIEN: INSERT INTO [SINHVIEN] VALUES („SV010‟, ‟Nguyễn Văn A‟, ‟12/02/1992‟, ‟Sơn Tịnh‟, ‟L1001‟) Trong trường hợp chỉ bổ sung dữ liệu cho một số trường, ta phải chỉ định tên trường sau tên bảng: INSERT INTO (danh sách trường) VALUES (danh sách giá trị) Ví dụ: Bổ sung thêm một sinh viên vào bảng SINHVIEN: INSERT INTO [SINHVIEN]([masv], [tensv], [ngaysinh],[quequan]) VALUES („SV011‟,‟Trần Thanh B‟,‟22/11/1992‟,‟Sơn Hà‟) b) Câu lệnh Update: Cú pháp: UPDATE SET = Trang 62
  8. [,…, = ] [FROM ] [WHERE ] Ví dụ: Sửa lại quê quán của sinh viên có mã là “SV011” thành “Bình Sơn”: UPDATE [SINHVIEN] SET [quequan]=‟Bình Sơn‟ WHERE [masv]=‟SV011‟ c) Câu lệnh Delete: Cú pháp: DELETE FROM [FROM ] [WHERE ] Ví dụ: Xóa các sinh viên có mã là “SV011”: DELETE FROM [SINHVIEN] WHERE ([masv]=‟SV011‟) d) Câu lệnh Select: Cú pháp: SELECT FROM [WHERE ] [GROUP BY [HAVING ]] [ORDER BY ] Trong đó: - Mệnh đề SELECT: danh sách trường gồm: tên các trường trong các bảng trong mệnh đề FROM, tên các trường mới, … Giá trị của trường mới có thể được tạo thành bằng các biểu thức, hàm được xây dựng sẵn. - Mệnh đề FROM: danh sách các bảng là tên các bảng. Có thể dùng bí danh (As) cho bảng. - Mệnh đề WHERE: điều kiện lọc - Mệnh đề GROUP BY: dùng để nhóm các bảng ghi theo một số trường nào đó. Kết quả có thể được lọc bởi mệnh đề HAVING BY. Trang 63
  9. - Mệnh đề ORDER BY: sắp xếp kết quả theo các trường Ví dụ: Câu lệnh lấy danh sách magv, tengv của các giáo viên: SELECT [magv],[tengv] FROM [GIAOVIEN] Ví dụ: Câu lệnh lấy danh sách magv, tengv, ngaysinh, trinhdo của các giáo viên: SELECT * FROM [GIAOVIEN] Ví dụ: Câu lệnh lấy danh sách masv, tensv, ngaysinh, quequan, tenlop của các sinh viên: SELECT [masv], [tensv], [tensv], [ngaysinh],[quequan], [tenlop] FROM ([LOP] INNER JOIN [SINHVIEN] ON [LOP].[malop] =[SINHVIEN].[malop]) Ví dụ: Câu lệnh lấy danh sách masv, tensv của các sinh viên có quê quán tại “Sơn Tịnh”: SELECT [masv],[tensv] FROM [LOP] WHERE ([quequan]=‟Sơn Tịnh‟) Ví dụ: Câu lệnh lấy danh sách masv, tensv của các sinh viên sinh năm 1994 và có quê ở “Sơn Hà”: SELECT [masv],[tensv] FROM [SINHVIEN] WHERE (Year([ngaysinh])=1994)And([quequan]=‟Sơn Hà‟) Ví dụ: Câu lệnh lấy danh sách tenlop, “số sinh viên của lớp” của tất cả các lớp sắp xếp theo tên lớp: SELECT [tenlop],count([masv]) As CountOfmasv FROM [LOP] INNER JOIN [SINHVIEN] ON [LOP].[malop]=[SINHVIEN].[malop] GROUP BY [tenlop] ORDER BY [tenlop] Ví dụ: Câu lệnh lấy danh sách malop, tenlop, “số sinh viên của lớp” của các lớp có sĩ số lớn hơn 19: Trang 64
  10. SELECT [malop],[tenlop],count([masv]) As CountOfmasv FROM [LOP] INNER JOIN [SINHVIEN] ON [LOP].[malop]=[SINHVIEN].[malop] GROUP BY [LOP].[malop],[tenlop] HAVING (count([masv])>19) 4.3. Câu hỏi và bài tập 1) Tạo CSDL trên Server. 2) Viết các câu lệnh SQL phục vụ cho việc quản lý bảng LOP. 3) Viết các câu lệnh SQL phục vụ cho việc quản lý bảng SINHVIEN. 4) Viết các thủ tục lưu trữ phục vụ cho việc quản lý bảng LOP. 5) Viết các thủ tục lưu trữ phục vụ cho việc quản lý bảng SINHVIEN. 6) Viết các lệnh SQL nhằm: - Kiểm tra sự tồn tại của một CSDL đã có trên MS SQL Server. - Thêm Một CSDL mới. - Thêm các bảng LOP, SINHVIEN và các quan hệ lên CSDL. 7) Hãy cho biết các lợi ích của thủ tục lưu trữ. 4.4. Bài mẫu Thiết kế CSDL, nhập dữ liệu và viết khung nhìn, hàm chức năng theo yêu cầu sau: - Tạo CSDL có tên là QLSV với thiết kế như sau: Trang 65
  11. - Nhập dữ liệu: - Tạo khung nhìn có tên là View_TKGT để thống kê số lượng sinh viên của các lớp theo giới tính: CREATE VIEW View_TKGT AS SELECT malop, SUM(CASE gioitinh WHEN 1 THEN 1 ELSE 0 END) AS „Nam‟, SUM(CASE gioitinh WHEN 0 THEN 1 ELSE 0 END) AS „Nữ‟ FROM SINHVIEN GROUP BY malop Go - Tạo hàm người dùng có tên là Fun_LayTT để lấy thông tin của một sinh viên phục vụ cho việc in giấy xác nhận phục vụ mục đích tạm hoãn nghĩa vụ quân sự với tham số vào là mã sinh viên và với các tham số ra là họ tên, ngày sinh, giới tính, lớp, khoa, năm học hiện tại, năm bắt đầu, năm kết thúc khóa học. CREATE FUNCTION Fun_LayTT (@masv nvarchar(12)) RETURNS TABLE AS RETURN Select hodem+' '+ten As hotensv,ngaysinh,case gioitinh when 1 then 'Nam' else N'Nữ' end As phai, LOP.malop, tenkhoa,namht, khoa,khoa+sonam As namkt from LOP Inner Join SINHVIEN on Lop.malop=SINHVIEN.malop Where masv=@masv Go Trang 66
  12. Chương 5: Truy cập cơ sở dữ liệu với ADO.NET Thời lượng: 12 tiết Mục tiêu: - Hiểu vai trò, chức năng của các đối tượng hỗ trợ truy cập CSDL, - Hiểu được cách truy cập dữ liệu với đối tượng Command, - Hiểu được cách truy cập dữ liệu với mô hình CSDL ảo, - Buộc được dữ liệu đơn giản, phức tạp, - Viết được chương trình truy cập CSDL đơn giản. 5.1. Mô hình kết nối và truy cập dữ liệu với ADO.NET 5.1.1. Mô hình kết nối và truy cập dữ liệu tổng quát Hình 5-1 mô tả đơn giản kiến trúc tổng quát của ADO.NET. Các đối tượng trong kiến trúc này đều thuộc không gian tên System.Data. Sau đây là ý nghĩa của các đối tượng: Tên đối tượng Ý nghĩa Connection để kết nối đến một CSDL Transaction hỗ trợ giao tác trong truy cập dữ liệu Command thực hiện các câu lệnh SQL DeleteCommand thực hiện câu lệnh xóa UpdateCommand thực hiện câu lệnh sửa InsertCommand thực hiện câu lệnh chèn SelectCommand thực hiện câu lệnh lấy dữ liệu DataReader đọc dữ liệu từng dòng một DataAdapter hỗ trợ DataSet đồng bộ dữ liệu với CSDL qua các câu lệnh SQL DataSet CSDL ảo trên ứng dụng DataTable bảng trong DataSet Trang 67
  13. Database Tabl e Connection Transaction DeleteCommand Application Command UpdateCommand InsertCommand SelectCommand DataReader DataAdapter DataSet Command DataTable Hình 5-1 Mô hình truy cập dữ liệu tổng quát trong ADO.NET 5.1.2. Connection Để kết nối đến một CSDL ta sử dụng đối tượng Connection. Đối với mỗi loại CSDL, .NET thiết kế một lớp Connection cụ thể. Chẳng hạn, với CSDL MS SQL Server thì có SqlConnection thuộc không gian tên System.Data.SqlClient, với CSDL MS Access thì có OleDbConnection thuộc không gian tên System.Data.OleDb,… Như Connection, các lớp Command, Transaction, DataReader, DataAdapter cũng được thiết kế tương tự cho các loại CSDL. Sau đây là một số thuộc tính, phương thức của lớp Connecttion. Tên Ý nghĩa ConnectionString tên chuỗi kết nối. Một chuỗi kết nối có các thông tin: tên HQT CSDL, tên máy chủ, tên CSDL, tên đăng nhập, mật Trang 68
  14. khẩu,… Có một số điều khiển dữ liệu giúp ta có được ConnectionString một cách chính xác. State trạng thái của kết nối Close() đóng kết nối Open() mở kết nối 5.1.3. Kết nối đến cơ sở dữ liệu Việc kết nối đến CSDL dựa trên mô hình Client - Server. CSDL được trên Server và chương trình ứng dụng được đặt ở máy người dùng (Client). Quy trình để một Client kết nối đến Server được thực hiện theo các bước sau: - Client gửi chuỗi kết nối chứa các thông tin về Client và CSDL muốn kết nối đến Server. - Server kiểm tra thông tin: + Nếu hợp lệ thì cho phép Client quyền truy cập CSDL tương ứng. Việc truy cập cũng được thực hiện bằng các câu lệnh SQL. + Nếu không hợp lệ thì không cấp quyền truy cập. Để truy cập đến một CSDL ta thực hiện theo các bước: Bước 1: tạo đối tượng Connection - Xác định chuỗi kết nối đến CSDL cần truy cập. Giả sử biến được đặt tên là ChuoiKetNoi. ChuoiKetNoi = @"Data Source=XP-VANTOAN\SQLEXPRESS;Initial Catalog=QLSV;Integrated Security=True"; - Tạo đối tượng Connection. Giả sử biến được đặt tên là KN. Như vậy, ta có thể tạo đối tượng Connection như sau. SqlConnection KN = new SqlConnection(ChuoiKetNoi); Bước 2: truy cập dữ liệu Để truy cập dữ liệu với CSDL MS SQL Server ta thực hiện theo trình tự: - Mở kết nối: KN.Open(); - Thực hiện các câu lệnh SQL. - Đóng kết nối: KN.Close(); Trang 69
  15. Để kiểm tra kết nối có thành công hay không, ta có thể xây dựng phương thức KiemTraKN như sau: Public static bool KiemTraKN() { try { KN.Open(); KN.Close(); return true; } catch { return false; } } Phương thức KiemTraKN() sẽ trả về true khi kết nối thành công, ngược lại thì kết nối không thành công. Người ta thường xây dựng thuộc tính Connection để lấy đối tượng Connection cụ thể làm nhiệm vụ kết nối. Trong các thao tác cập nhật dữ liệu, đối tượng làm nhiệm vụ kết nối được sử dụng thường xuyên nên thuộc tính này là rất hữu ích. 5.1.4. Transaction Là lớp hỗ trợ quản lý theo giao tác trong việc cập nhật dữ liệu. Nếu không sử dụng giao tác, một thao tác cập nhật (thêm, xóa, sửa) sẽ làm thay đổi dữ liệu thật sự. Còn khi sử dụng giao tác, ta có thể sử dụng một số thao tác cập nhật dữ liệu thì dữ liệu cũng thay đổi nhưng chưa có hiệu lực thực sự cho đến chấp nhận hoặc hủy bỏ giao tác. Nếu chập nhận giao tác thì các thao tác cập nhật dữ liệu trong giao tác đó sẽ có hiệu lực, còn nếu hủy bỏ giao tác thì các thao tác cập nhật dữ liệu trong giao tác đó không có hiệu lực. Việc sử dụng giao tác trong việc cập nhật dữ liệu là cần thiết trong các trường hợp liên quan đến những dữ liệu quan trọng. Trình tự thực hiện cập nhật dữ liệu theo giao tác trải qua các bước: Bước 1: bắt đầu một giao tác - Sử dụng đối tượng Connection hiện tại: Trang 70
  16. Connection.Open(); SqlTransaction gt = Connection.BeginTransaction(); Bước 2: thực hiện cập nhật dữ liệu Thực hiện các thao tác cập nhật dữ liệu Bước 3: chấp nhận hoặc hủy bỏ giao tác - Nếu chấp nhận giao tác, ta thực hiện: gt.Commit(); Connection.Close(); - Nếu hủy bỏ giao tác, ta thực hiện: gt.Rollback(); Connection.Close(); 5.2. Mô hình truy cập dữ liệu với Command Đối với mô hình này, việc cập nhật dữ liệu được thực hiện thông qua đối tượng Command, việc đọc dữ liệu thông qua đối tượng DataReader kết hợp với đối tượng Command. 5.2.1. Command Là lớp hỗ trợ việc gửi các câu lệnh SQL đến HQT CSDL có CSDL cần truy cập và hỗ trợ việc đọc dữ liệu gửi về từ HQT CSDL. Một số thuộc tính và phương thức của lớp Command: Tên Ý nghĩa CommandType kiểu Command, là một trong ba giá trị: Text (mặc định), StoredProcedure, TableDirect. CommandText tương ứng với CommandType là một trong ba kiểu: câu lệnh SQL, tên thủ tục lưu trữ, tên bảng. Connection đối tượng kết nối. ExecuteNonQuery() thực thi truy vấn cập nhật (Insert, Delete, Update) và trả về số lượng dòng dữ liệu bị ảnh hưởng bởi truy vấn. Giả sử: biến cmd có CommandText là “Delete SINHVIEN Where masv = A123”; Khi đó: int soluong = cmd.ExecuteNonQuery(); Trang 71
  17. ExecuteReader() thực thi một truy vấn và trả về đối tượng DataReader để truy cập kết quả truy vấn. Giả sử: biến cmd có CommandText là “Select * From SINHVIEN”; Khi đó: SqlDataReader rd = cmd.ExecuteReader(); ExecuteScalar() thực thi một truy vấn và trả về giá trị ở cột đầu tiên của dòng đầu tên trong bảng kết quả truy vấn. Giả sử: biến cmd có CommandText là “Select Count(*) From SINHVIEN”; Khi đó: int soluongsv = (int)cmd.ExecuteScalar(); 5.2.2. DataReader Là lớp hỗ trợ việc đọc từng dòng dữ liệu từ bảng dữ liệu trả về của phương thức ExecuteReader() của một đối tượng Command. Cách đọc dữ liệu của DataReader cũng tương tự như cách đọc của StreamReader. Sau đây là một số thuộc tính, phương thức thường dùng của DataReader: Tên Ý nghĩa FieldCount số cột của bản ghi HasRows còn 1 hoặc nhiều dòng dữ liệu chưa đọc tới IsClosed không còn trong trạng thái đọc Close() kết thúc việc đọc NextResult() còn 1 hoặc nhiều dòng dữ liệu chưa đọc tới Read() đọc một dòng dữ liệu. Sau đây là đoạn mã lệnh sử dụng DataReader đọc dữ liệu và đưa dữ liệu vào một ListBox: cmd.CommandText="Select * From SINHVIEN"; SqlDataReader rd = cmd.ExecuteReader(); ListBox ds = new ListBox(); Trang 72
  18. while (rd.Read()) { string st = rd[1].ToString(); ds.Items.Add(st); } rd.Close(); Hình 5-2 mô tả mô hình truy cập dữ liệu với Command. Database Tabl e Connection Transaction Application DeleteCommand Command UpdateCommand InsertCommand SelectCommand DataReader Hình 5-2 Mô hình truy cập dữ liệu với Command Trong mô hình này, mỗi lần có một thao tác truy cập CSDL, ta mở kết nối với CSDL để thực hiện các thao tác. Thực hiện xong, ta đóng kết nối. 5.3. Mô hình truy cập dữ liệu nâng cao với cơ sở dữ liệu ảo 5.3.1. DataSet Là lớp đóng vai trò như là một CSDL ảo. Cơ sở dữ liệu này cũng chứa các bảng (DataTable), các mối quan hệ giữa các bảng (DataRelation),… Sau đây là hai thuộc tính thường dùng của DataSet: Trang 73
  19. - Tables: chứa tập các bảng ảo (DataTable). - Relations: chứa các mối quan hệ ảo (DataRelation). 5.3.2. DataAdapter Lớp DataAdapter được xem là cầu nối giữa CSDL (trên Server) và DataSet (CSDL ảo trên bộ nhớ của máy Client). DataAdapter được xem như là một Command thông minh, hỗ trợ việc lấy dữ liệu từ CSDL về DataSet và cập nhật dữ liệu từ DataSet lên CSDL. Việc cập nhật dữ liệu từ DataSet lên CSDL được hỗ trợ bởi CommandBuider. CommandBuider hỗ trợ bằng cách tự động sinh các đối tượng Command thích hợp cho việc cập nhật dữ liệu. CommandBuider sinh các đối tượng Command dựa vào TableMapping, nơi lưu giữ các thao tác cập nhật dữ liệu trong DataSet. Hình 5-3 mô tả mô hình truy cập dữ liệu với cơ sở dữ liệu ảo. Database Tabl e Application Connection Transaction DataAdapter DataSet Command DataTable Hình 5-3 Mô hình truy cập dữ liệu với DataSet Trong mô hình này, trong việc lấy dữ liệu từ CSDL về DataSet, việc mở/đóng kết nối được thực hiện tương tự như mô hình trước. Tuy nhiên, trong việc cập nhật dữ liệu từ DataSet lên CSDL, việc mở/đóng kết nối được thực hiện tự động. Việc lấy dữ liệu từ CSDL về DataSet được thực hiện qua phương thức Fill() và việc cập nhật dữ liệu từ DataSet lên CSDL được thực hiện thông qua phương thức Update(). Các công việc đó có thể được thực hiện như sau: Bước 1: lấy dữ liệu từ CSDL về DataSet Giả sử trên CSDL có bảng SINHVIEN Trang 74
  20. Connection.Open(); cmd.CommandText="Select * From SINHVIEN"; SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable sv = new DataTable(); SqlCommandBuider cdb = new SqlCommandBuider(da); (*) da.Fill(sv); Connection.Close(); Chú ý: nếu không thực hiện việc cập nhật từ DataSet lên CSDL như ở bước 3 thì câu lệnh (*) là không cần thiết. Bước 2: thực hiện các thao tác cập nhật dữ liệu ở DataSet Ta thực hiện các thao tác thay đổi dữ liệu như: thêm sinh viên, sửa thông tin sinh viên nào đó, xóa bớt sinh viên,… Nếu sau khi thực hiện một số cập nhật mà ta thấy các thao tác này là không cần thiết thì có thể sử dụng phương thức RejectChanges() của DataTable sv. Bước 3: cập nhật dữ liệu từ DataSet lên CSDL da.Update(sv); 5.4. Buộc dữ liệu 5.4.1. Mô hình truy cập và hiển thị dữ liệu Hình 5-4 mô tả mô hình truy cập và hiển thị dữ liệu của một ứng dụng: Dữ liệu vật lý Đối tượng dữ Đối tượng hiển 1 liệu 2 thị dữ liệu *.mdf, *.txt class, TextBox, 3 DataTable, 3 ListBox, Mảng DataGridView 1 : Lấy dữ liệu từ 2 : Hiển thị dữ liệu lên 3 : Thay đổi dữ liệu đến Hình 5-4 Mô hình buộc dữ liệu Như vậy, trong mô hình này có ba thành phần: dữ liệu vật lý, đối tượng dữ liệu và đối tượng hiển thị dữ liệu. Trong đó: Dữ liệu vật lý là dữ liệu được lưu trữ trên bộ nhớ. Nó có thể là một file Trang 75
nguon tai.lieu . vn