Bài Giảng môn học Hệ Quản trị cơ sở dữ liệu 2008 Trường Đại học MỏĐịa Chất. Tác giả: Thầy Đặng Xuân Nghị. Năm học 20182019.........................................................................................
TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT ĐẶNG HỮU NGHỊ BÙI THỊ VÂN ANH BÀI GIẢNG HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU HÀ NỘI - 2018 MỤC LỤC Chương : Những khái niệm sở liệu I Cơ sở liệu gì? Hệ quản trị sở liệu Bản ghi trường II Thiết kế sở liệu Các mối quan hệ Sử dụng tính tồn vẹn tham chiếu để trì tính qn Chuẩn hoá Chương : Giới thiệu SQL Server 2008 I SQL Server 2008 II Bắt đầu với SQL Server Management Studio 10 Chương 3: Một số thao tác SQL Server 2008 16 Tạo CSDL 16 Tạo bảng 17 Thay đổi cấu trúc bảng 24 Lược đồ CSDL 25 Nhập liệu cho bảng 30 Xóa bảng, xóa CSDL 30 Mở query editor để viết câu lệnh SQL 30 Chương 4: Các câu lệnh SQL 34 I Giới thiệu sơ lược Transact SQL (T-SQL) 34 II Ngôn ngữ thao tác liệu 34 Câu lệnh Select 34 Truy vấn liệu từ nhiều bảng 44 Truy vấn (Subquery) 47 Thêm liệu vào bảng 48 Cập nhật liệu 49 Xóa liệu 50 III Ngôn ngữ định nghĩa liệu 50 Tạo bảng 50 Sửa đổi định nghĩa bảng 53 Xóa bảng 54 Khung nhìn - VIEW 54 Chương 5: Một số hàm SQL Server 57 I Các hàm liệu kiểu số 57 Hàm ABS 57 Hàm CEILING 57 Hàm FLOOR 57 Hàm ROUND 57 Hàm SQUARE 57 Hàm SQRT 57 Hàm isNumeric: 57 II Nhóm hàm thống kê 57 Hàm COUNT: 57 Hàm MAX: 57 Hàm MIN: 57 Hàm SUM: 57 Hàm AVG: 58 III Nhóm hàm xử lý chuỗi kí tự 58 Hàm LEFT 58 Hàm RIGHT 58 Hàm LEN 58 Hàm LTRIM 58 Hàm RTRIM 58 Hàm LOWER 58 Hàm UPPER 58 Hàm SUBSTRING 58 Hàm Replace 58 10 Hàm STR 58 IV Nhóm hàm ngày tháng 59 Hàm GETDATE: 59 Hàm DATEPART 59 Hàm DAY( ): 59 Hàm MONTH( ): 59 Hàm YEAR( ): 60 DATEADD 60 DATEDIFF 60 V Hàm CAST CONVERT 60 Chương 6: Thủ tục lưu trữ, hàm trigger 62 I Thủ tục lưu trữ (Stored Procedure) 62 Tạo thủ tục lưu trữ Lệnh CREATE 62 Biến thủ tục lưu trữ 63 Giá trị trả thủ tục lưu trữ 64 Các lệnh điều khiển 65 Thay đổi thủ tục lưu trữ 68 Xóa thủ tục lưu trữ 68 II Hàm người dùng định nghĩa (User Defined Function-UDF) 68 Hàm Scalar 68 Hàm Inline Table-Valued 69 Hàm Multi-Statement Table-Valued 69 III Trigger 70 Tạo Trigger 72 Trigger cho hành động thêm ghi 73 Trigger cho hành động cập nhật ghi 75 Trigger cho hành động xóa ghi 75 Chương 7: SQL Server lập trình ứng dụng 77 I Mơ hình kết nối ứng dụng đến SQL server 77 Mơ hình ADO 77 Mô hình ADO.NET 78 Khác biệt ADO ADO.NET 79 II Truy cập liệu với VB ADO 80 ADO 80 Ví dụ 85 III Truy cập liệu với VB.NET ADO.NET 91 ADO.NET 91 Các ví dụ 96 VI Truy cập liệu với C# ADO.NET 104 ADO.NET 104 Các ví dụ 106 PHỤ LỤC 110 Chương : Những khái niệm sở liệu I Cơ sở liệu gì? Cơ sở liệu kho chứa thơng tin Có nhiều loại sở liệu, ta đề cập đến sở liệu quan hệ, kiểu sở liệu phổ biến Một sở liệu quan hệ: Chứa liệu bảng, cấu tạo dòng gọi ghi, cột gọi trường Cho phép lấy (hay truy vấn) tập hợp liệu từ bảng Cho phép liên kết bảng với cho mục đích truy cập ghi liên quan với chứa bảng khác Hệ quản trị sở liệu Hệ quản trị sở liệu (Database Management System - DBMS): Là hệ thống phần mềm cho phép tạo lập sở liệu điều khiển truy nhập sở liệu Trên thị trường phần mềm Việt Nam xuất nhiều phần mềm hệ quản trị sở liệu như: Microsoft Access, Foxpro, DB2, SQL Server, Oracle,.v.v… - Hệ quản trị sở liệu quan hệ (Relation Database Management System - RDBMS) hệ quản trị sở liệu theo mơ hình quan hệ Bản ghi trường Các sở liệu cấu tạo từ bảng dùng thể phân nhóm liệu Ví dụ, ta tạo sở liệu để quản lý tài khoản công việc kinh doanh ta phải tạo bảng cho khách hàng, bảng cho Hoá đơn bảng cho nhân viên Bảng có cấu trúc định nghĩa sẵn chứa liệu phù hợp với cấu trúc Bảng: Chứa ghi tin mẩu riêng rẽ bên phân nhóm liệu Bản ghi: Chứa trường Mỗi trường thể phận liệu ghi Ví dụ ghi thể mục danh bạ địa chứa trường Họ tên, địa chỉ, số điện thoại II Thiết kế sở liệu Để tạo sở liệu, trước hết ta phải xác định thơng tin cần theo dõi Sau đó, ta thiết kế sở liệu, tạo bảng chứa trường định nghĩa kiểu liệu có Sau tạo cấu trúc sở liệu, sở liệu chứa liệu dạng ghi Ta đưa liệu vào mà khơng có bảng hay định nghĩa trường liệu khơng có chỗ để chứa Do đó, thiết kế sở liệu quan trọng, khó thay đổi thiết kế ta tạo xong Ví dụ ta tạo bảng sau: Bảng khách hàng tblCustomer CustomerID FirstName LastName Company Address City State Zip Phone Fax Email Bảng tblRegion TblRegion State RegionName Có quan hệ bảng thơng qua trường State Đây mối quan hệ nhiều, ghi tblRegion, khơng có, có nhiều ghi tương ứng bảng tblCustomer Cụm từ “tbl” thể tên bảng, tên trường hiển thị đầy đủ, không chứa khoảng trắng hay ký tự đặc biệt khác dấu gạch Bảng hố đơn: TblOrder ID CustomerID OrderDate ItemID Amount Khóa chính: kiểu mục đặc biệt Một trường khóa bảng phục vụ cho việc xác định ghi Vì khơng kiểu mục khác, khơng có hai ghi bảng mà có giá trị cho trường khóa Khi thiết kế trường làm khóa chính, khơng có ghi chứa giá trị rỗng (giá trị NULL) trường Khi trường khóa bảng ta tạo mối quan hệ bảng với bảng khác CSDL Các mối quan hệ Mối quan hệ cách định nghĩa thức hai bảng liên hệ với Khi ta định nghĩa mối quan hệ, ta thông báo với máy sở liệu hai trường hai bảng liên quan nối với Hai trường liên quan với mối quan hệ khố khố ngoại Khố ngoại khoá bảng liên quan chứa khố bảng Sau mối quan hệ báo cho máy sở liệu hai bảng liên quan với mối quan hệ khoá ngoại liên quan với khố Ngồi việc ghép ghi liên quan bảng riêng biệt, ta định nghĩa mối quan hệ để tận dụng mạnh tính tồn vẹn tham chiếu, thuộc tính máy sở liệu trì liệu sở liệu nhiều bảng ln ln qn Khi tính tồn vẹn tham chiếu tồn sở liệu, máy sở liệu ngăn cản ta xố ghi có ghi khác tham chiếu đến sở liệu Sau định nghĩa mối quan hệ sở liệu, việc định nghĩa mối quan hệ lưu trữ ta xóa Sử dụng tính tồn vẹn tham chiếu để trì tính qn Khi bảng nối kết với thông qua mối quan hệ, liệu bảng phải trì quán bảng liên kết Tính tồn vẹn tham chiếu quản lý cơng việc cách theo dõi mối liên hệ bảng ngăn cấm kiểu thao tác ghi Ví dụ, giả định ta có bảng gọi tblCustomer bảng khác tblOrder Hai bảng quan hệ với qua trường chung CustomerID Giả thiết ta tạo khách hàng chứa tblCustomer tạo hố đơn tblOrder Nhưng điều xảy ta tiến hành xố khách hàng có hoá đơn chưa xử lý chứa bàng hoá đơn? Hoặc ta tạo hố đơn mà khơng có CustomerID hợp lệ gắn liền với nó? Mục hố đơn khơng có CustomerID khơng thể gửi đi, địa gửi trường mẩu tin tblCustomer Khi liệu bảng quan hệ gặp phải rắc rối này, ta nói trạng thái không quán Một điểu quan trọng sở liệu không trở nên không quán, máy sở liệu cung cấp cách để ta định nghĩa mối quan hệ bảng Khi ta định nghĩa mối quan hệ thức hai bảng máy sở liệu giám sát mối quan hệ ngăn cấm thao tác vi phạm tính tồn vẹn tham chiếu Hoạt động chế toàn vẹn tham chiếu phát sinh lỗi ta thi hành hành động làm cho liệu rơi vào trạng thái khơng qn Ví dụ, sở liệu có tính tồn vẹn tham chiếu hoạt động, ta cố tạo hoá đơn chứa CustomerID khách hàng khách hàng không tồn tại, ta nhận thơng báo lỗi hố đơn khơng thể tạo Chuẩn hoá Chuẩn hoá khái niệm liên quan đến mối quan hệ Về bản, nguyên tắc chuẩn hoá phát biểu bảng sở liệu loại trừ tính khơng qn giảm thiểu hiệu Các sở liệu mô tả không quán liệu bảng không tương ứng với liệu nhập vào bảng khác Ví dụ, Nếu phân nửa số người nghĩ Arkansr miền Trung Tây nửa nghĩ nằm phía Nam hai nhóm nhân viên nhập liệu theo ý kiến riêng họ, báo cáo sở liệu trình bày việc xảy miền Trung Tây vô nghĩa Một sở liệu hiệu khơng cho phép ta trích liệu xác mà ta muốn Một sở liệu chứa toàn liệu bảng buộc ta phải vất vả duyệt qua lượng lớn tên khách hàng, địa lịch sử liên hệ để lấy số điện thoại khách hàng Mặt khác, sở liệu chuẩn hoá đầy đủ chứa mẩu thông tin sở liệu bảng riêng xa hơn, xác định mẩu thơng tin thơng qua khố Các sở liệu chuẩn hoá cho phép ta tham chiếu đến mẩu thông tin bảng khố thơng tin Ta định cách thức chuẩn hoá sở liệu ta thết kế khởi tạo sở liệu Thông thường, thứ ứng dụng sở liệu - từ thiết kế bảng thiết kế truy vấn, từ giao diện người sử dụng đến cách hoạt động báo cáo - xuất phát từ cách chuẩn hoá sở liệu Là lập trình viên sở liệu, bạn nảy ý nghĩ sở liệu chưa chuẩn hoá lý hay lý khác Sự thiếu chuẩn hố chủ ý, kết thiếu kinh nghiệm không thận trọng việc thiết kế sở liệu ban đầu Dù mức độ nào, chọn chuẩn hoá sở liệu tồn tại, ta nên thực sớm (bởi thứ khác thực sở liệu phụ thuộc vào cấu trúc bảng sở liệu) Hơn nữa, ta thấy câu truy vấn hành động cơng cụ hữu ích việc xếp lại sở liệu thiết kế thiếu sót Truy vấn hành động cho phép ta di chuyển trường từ bảng sang bảng khác thêm, cập nhật xoá ghi từ bảng dựa tiêu chí nêu a Quan hệ Một - Một Là loại quan hệ dễ hiểu dễ thực nhất, mối quan hệ vậy, bảng lấy vị trí trường bảng khác, trường liên quan dễ nhận dạng Tuy nhiên, quan hệ - mối quan hệ thông dụng ứng dụng sở liệu Do nguyên nhân: Hầu ta không cần biểu diễn mối quan hệ - với hai bảng Ta dùng để cải tiến khả hoạt động, ví dụ ta tính linh hoạt chứa liệu liên hệ bảng tách biệt Trong ví dụ trước, thay có bảng nhân viên công việc chứa bảng nhân viên Thể quan hệ - nhiều dễ (nhưng linh hoạt nhiều) quan hệ - b Quan hệ - nhiều Phổ biến quan hệ - một, đó, ghi bảng khơng có, có một, nhiều ghi bảng liên hệ Ví dụ, ta gán khách hàng cho người bán hàng Để thực điều này, ta cần bảng cho người bán hàng : Bởi người bán hàng có trách nhiệm với nhiều khách hàng, ta nói có mối quan hệ - nhiều người bán hàng khách hàng Để thực mối quan hệ thiết kế sở liệu, ta phải copy khố phía đến bảng chứa phía nhiều quan hệ c Quan hệ nhiều nhiều Quan hệ nhiều - nhiều bước phát triển quan hệ - nhiều ví dụ cổ điển quan hệ nhiều nhiều học sinh lớp Mỗi học sinh có nhiều lớp, lớp có nhiều học sinh Để thiết lập quan hệ nhiều nhiều, ta sửa lại ví dụ trước cho sở liệu chứa nhiều người bán cho người mua Mỗi người bán có nhiều khách hàng, khách hàng có nhiều người bán Bài Tập Nêu đặc trưng Khóa (primary key) Khóa ngoại (foreign key) gì? Mục đích việc thiết kế CSDL quan hệ gì? Chương : Giới thiệu SQL Server 2008 I SQL Server 2008 SQL Server 2008 hệ thống quản lý sở liệu (Relational Database Management System (RDBMS)) sử dụng Transact-SQL để trao đổi liệu Client computer SQL Server computer Một RDBMS bao gồm databases, database engine ứng dụng dùng để quản trị liệu phận khác RDBMS SQL Server 2008 tối ưu để chạy mơi trường sở liệu lớn (Very Large Database Environment) lên đến Tera-Byte phục vụ lúc cho hàng ngàn user SQL Server 2008 kết hợp "ăn" với server khác Microsoft Internet Information Server (IIS), E-Commerce Server, Proxy Server Các phiên SQL Server 2008: SQL Server 2008 Express Edition SQL Server 2008 Enterprise Edition SQL Server 2008 Standard Edition SQL Server 2008 Workgroup Edition SQL Server 2008 Developer Edition SQL Server 2008 Compact Edition SQL Server 2008 Web Edition SQL Server 2008 Datacenter Edition Enterprise: Hỗ trợ khơng giới hạn số lượng CPU kích thước Database Hỗ trợ không giới hạn RAM (nhưng tùy thuộc vào kích thước RAM tối đa mà HĐH hỗ trợ) hệ thống 64bit Standard: Tương tự Enterprise hỗ trợ CPU Ngoài phiên khơng trang bị số tính cao cấp khác Workgroup: Tương tự Standard hỗ trợ CPU tối đa 3GB RAM Express: Bản miễn phí, hỗ trợ tối đa 1CPU, 1GB RAM kích thước tối đa Database 10GB Compact: Nhúng miễn phí vào mơi trường phát triển ứng dụng web Kích thước tối đa sở liệu 4GB Datacenter: Thay đổi lớn SQL Server 2008 R2 Datacenter myAdapter.Fill(myDataSet, strSQL) Tương tự vậy, trường hợp cập nhật liệu từ đối tượng DataSet vào liệu nguồn, bạn sử dụng phương thức Update DataAdapter Private Sub cmdUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdUpdate.Click dgView.Update() myAdapter.Update(myDataSet) End Sub DataSet dùng làm ảnh sở đữ liệu nguồn liệu Chính tính NET framework có khả lập trình theo mơ hình disconnected Sau kết nối lấy liệu lưu trữ dataset, lập trình viên hồn tồn xử lý bảng, row, constraint, relation mà không cần kết nối với database thực thụ Tất định nghĩa database View, Table, Relation, Constraint lưu dataset dạng đối tượng DataView, DataTable, Constraint, Relation, … Nếu không hiểu rõ dataset mơ hình disconnect ADO.NET khó viết ứng dụg CSDL Không sử dụng đối tượng DataSet để truy vấn liệu mà bạn di chuyển liệu gửi liệu thông qua định dạng XML Như trình bày lớp System.Data.SQLClient thiết kế để sử dụng cho SQL Server 7.0 phiên Khi làm việc với đối tượng DataSet, có hai cách sử dụng đối tượng để trình bày liệu Cách thứ bạn sử dụng đối tượng Form, cách thứ hai viết mã Visual Basic.NET Các ví dụ Ví dụ 1: Trong VB.NET ta xây dựng Form cho phép hiển thị liệu bảng KhachHang lên điều khiển lưới 96 TT Đối tượng Form DataGidView Button Button Thuộc tính Name Caption Name btnGetData btnUpdate Giá trị Form1 Customers dgView GetData Update Imports System.Data Imports System.Data.SqlClient Public Class frmCustemers #Region "Các khai báo chung" Dim myConnString As String = "server=MDC\SQLEXPRESS;” & _ “Database=QLDH;User ID=sa;password=123456" Dim Conn As New SqlConnection(myConnString) Dim myAdapter As New SqlDataAdapter Dim dsQLDH As DataSet Dim mySelectCommand As New SqlCommand Dim myBuilder As New SqlCommandBuilder(myAdapter) #End Region Private Sub btnGetData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetData.Click mySelectCommand.CommandText = "SELECT * FROM KhachHang" mySelectCommand.Connection = Conn myAdapter.SelectCommand = mySelectCommand dsQLDH = New DataSet ’Điền liệu vào Dataset myAdapter.Fill(dsQLDH, "KhachHang") ’Điền liệu từ Dataset vào DataGridView With dgView DataSource = dsQLDH DataMember = dsQLDH.Tables("KhachHang").ToString End With End Sub ’Cập nhật thay đổi liệu lưới vào CSDL Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click dgView.Update() myAdapter.Update(dsQLDH, "KhachHang") End Sub End Class 97 Ví dụ 2: Xây dựng chương trình có chức tương tự ví dụ sử dụng thủ tục lưu trữ Bước 1: Trong CSDL QLDH ta xây dựng thủ tục lưu trữ sau: Create proc sp_SelectKhachHang as select * from KhachHang Bước 2: Trong VB.NET ta xây dựng Form tương tự ví dụ 1, đưa vào đoạn lệnh sau: Imports System.Data Imports System.Data.SqlClient Public Class frmCustemers #Region "Các khai báo chung" Dim myConnString As String = server=MDC\SQLEXPRESS;” & _ “Database=QLDH;User ID=sa;password=123456" Dim Conn As New SqlConnection(myConnString) Dim myAdapter As New SqlDataAdapter Dim dsQLDH As DataSet Dim mySelectCommand As New SqlCommand("sp_SelectKhachHang",_ Conn) Dim myBuilder As New SqlCommandBuilder(myAdapter) #End Region Private Sub btnGetData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetData.Click mySelectCommand.CommandType = CommandType.StoredProcedure mySelectCommand.Connection = Conn myAdapter.SelectCommand = mySelectCommand dsQLDH = New DataSet myAdapter.Fill(dsQLDH, "KhachHang") With dgView DataSource = dsQLDH DataMember = dsQLDH.Tables("KhachHang").ToString End With End Sub Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click dgView.Update() myAdapter.Update(dsQLDH, "KhachHang") End Sub End Class 98 Ví dụ 3: Xây dựng Form cho phép xem nhập thông tin khách hàng sau: TT Đối tượng Form Label Label Label Label Label Label Label Label 10 Label 11 12 TextBox TextBox Thuộc tính Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Name 99 Giá trị Form1 Khách hàng Lable1 Thông tin khách hàng LblMaKhachHang Mã khách hàng LblHoDem Họ Đệm LblTen Tên LblNgaysinh Ngày sinh LblGioiTinh Giới tính LblDiachi Địa LblSoDienThoai Số điện thoại LblEmail Email txtRecordPosition txtMaKhachHang 13 14 15 16 17 18 19 TextBox TextBox TextBox TextBox TextBox TextBox Button 20 Button 21 Button 22 Button 23 Button 24 Button 25 Button 26 Button 27 Button 28 Button Name Name Name Name Name Name Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text Name Text txtHoDem txtTen txtGioiTinh txtDiaChi txtSoDienThoai txtEmail btnAdd Add btnEdit Edit btnDelete Delete btnClose Close btnUpdate Update btnCancel Cancel btnMoveFirst btnMoveLast >> Imports System.Data Imports System.Data.SqlClient Public Class frmKhachhang #Region "Các khai báo chung" Dim myConnString As String = "server=MDC\SQLEXPRESS;” & _ Database=QLDH;User ID=sa;password=123456" Dim Conn As New SqlConnection(myConnString) Dim myAdapter As New SqlDataAdapter Dim dsQLDH As DataSet Dim mySelectCommand As New SqlCommand Dim myBindingManagerBase As BindingManagerBase Dim myBuilder As New SqlCommandBuilder(myAdapter) #End Region Private Sub UnhandledExceptionHandler() 'Thủ tục thông báo lỗi MsgBox("Một lỗi xảy ra." & vbCrLf & "Mã lỗi: " &_ Err.Number & _ vbCrLf & "Mô tả: " & Err.Description & vbCrLf & "Nguồn: " &_ Err.Source) End Sub 100 Private Sub frmKhachhang_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load mySelectCommand.CommandText = "SELECT * FROM KhachHang" mySelectCommand.Connection = Conn myAdapter.SelectCommand = mySelectCommand dsQLDH = New DataSet myAdapter.Fill(dsQLDH, "KhachHang") Binding() ShowPosition() End Sub Private Sub Binding() 'Gán kết tới DataSet điều khiên txtMakhachhang.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.MaKhachHang")) txtHodem.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.HoDem")) txtTen.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.Ten")) txtNgaysinh.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.Ngaysinh")) txtDiachi.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.Diachi")) txtSodienthoai.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.Sodienthoai")) txtGioitinh.DataBindings.Add(New Binding("Text", dsQLDH, _ "KhachHang.Gioitinh")) myBindingManagerBase = Me.BindingContext(dsQLDH,_ "KhachHang") End Sub Private Sub btnMoveFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveFirst.Click Try ’Di chuyển đến ghi myBindingManagerBase.Position = ShowPosition() Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnMovePrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMovePrevious.Click Try myBindingManagerBase.Position -= ShowPosition() 101 Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnMoveLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveLast.Click Try ’Di chuyển đến ghi cuối myBindingManagerBase.Position = _ myBindingManagerBase.Count - ShowPosition() Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnMoveNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMoveNext.Click Try ’Di chuyển đến ghi myBindingManagerBase.Position += ShowPosition() Catch UnhandledExceptionHandler() End Try End Sub Private Sub ShowPosition() ' Hiển thị ghi hành số ghi txtRecordPosition.Text = "Bản ghi " & _ myBindingManagerBase.Position + & " / " & _ myBindingManagerBase.Count() End Sub Private Sub SetButtons(ByVal bVal As Boolean) ’Cho ẩn (hiện), kích hoạt (khơng kích hoạt) nút lệnh btnAdd.Visible = bVal btnEdit.Visible = bVal btnUpdate.Visible = Not bVal btnCancel.Visible = Not bVal btnDelete.Visible = bVal btnClose.Visible = bVal btnMoveNext.Enabled = bVal btnMoveFirst.Enabled = bVal btnMoveLast.Enabled = bVal btnMovePrevious.Enabled = bVal End Sub 102 Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click Try ’Thêm ghi Dim myRow As DataRow SetButtons(False) myRow = dsQLDH.Tables("KhachHang").NewRow() dsQLDH.Tables("KhachHang").Rows.Add(myRow) myBindingManagerBase.Position = _ myBindingManagerBase.Count - ShowPosition() txtMakhachhang.ReadOnly = True txtHodem.Focus() Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click Try ’Cập nhật thay đổi từ Dataset CSDL myRow = dsQLDH.Tables("KhachHang")._ Rows(myBindingManagerBase.Position) myAdapter.Update(dsQLDH, "KhachHang") dsQLDH.AcceptChanges() SetButtons(True) Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click Try SetButtons(True) dsQLDH.RejectChanges() myBindingManagerBase.Position = ShowPosition() Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click End End Sub 103 Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click Try 'Xóa ghi hành Dim oRow As DataRow Dim oTable As DataTable Dim intResponse As Integer SetButtons(False) intResponse = MsgBox("Bạn có muốn xóa ghi hành hay khơng?", MsgBoxStyle.YesNo, "Confirm Delete") If intResponse = vbYes Then oTable = dsQLDH.Tables("KhachHang") oRow = oTable.Rows(myBindingManagerBase.Position) If Not oRow.RowState = DataRowState.Deleted Then _ oRow.Delete() myBindingManagerBase.Position -= End If ShowPosition() Catch UnhandledExceptionHandler() End Try End Sub Private Sub btnEdit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEdit.Click ’Sửa đổi nội dung ghi hành SetButtons(False) End Sub End Class VI Truy cập liệu với C# ADO.NET ADO.NET a Các Net Data Provider ADO.Net Sử dụng NameSpace System.Data để lập trình với ADO.NET Các Net Data Provider sử dụng để kết nối tới sở liệu, thực thi câu lệnh truy vấn (SQL) lấy liệu Dữ liệu trả xử lý trực tiếp, đặt đối tượng DataSet, kết hợp với liệu từ nhiều nguồn gửi liệu tầng (tiers) mơ hình lập trình nhiều tầng (N-Tier) Trong Net Framework có Net Data Provider mặc định sau: NET Data Provider System.Data.SqlClient cho SQL 104 Server: sử dụng namespace NET Data Provider System.Data.OleDb cho OLE DB: sử dụng namespace NET Data Provider cho ODBC: sử dụng namespace System.Data.Odbc NET Data Provider System.Data.OracleClient cho Oracle: sử dụng namespace EntityClient Provider: cung cấp truy cập liệu cho ứng dụng dạng Entity Data Model (EDM), sử dụng namespace System.Data.EntityClient NET Data Provider cho SQL Server Compact 4.0: cung cấp truy cập liệu cho Microsoft SQL Server Compact 4.0, sử dụng namespace System.Data.SqlServerCe b Các đối tượng Net Data Provider Connection: thiết lập kết nối tới nguồn liệu Command: thực thi câu lệnh truy vấn với nguồn liệu từ Connection DataReader: cung cấp luồng (stream) liệu đọc từ nguồn liệu DataAdapter: đặt liệu vào DataSet cập nhật liệu từ DataSet nguồn liệu c Các phương thức thuộc tính quan trọng Connection Thuộc tính ConnectionString: truyền vào chuỗi kết nối tới nguồn liệu Phương thức Open: mở kết nối Phương thức Close: đóng kết nối Command Thuộc tính CommandText: truyền vào câu lệnh SQL tên Stored procedure Thuộc tính CommandType: kiểu câu lệnh SQL StoredProcedure, TableDirect hay Text Thuộc tính Connection: truyền vào đối tượng Connection Phương thức ExecuteReader: thực thi với câu lệnh SQL Select trả luồng liệu qua đối tượng DataReader 105 Phương thức ExecuteScalar: thực thi câu lệnh SQL Select trả giá trị hàng cột Thích hợp với câu lệnh Select dạng thống kê Count, Sum, AVG … Phương thức ExecuteNonQuery: thực thi câu lệnh SQL Insert, Update, Delete … không trả kết Phương thức ExecuteXMLReader: thực thi câu lệnh truy vấn với câu lệnh cho XML DataReader Phương thức Read: đọc hàng liệu DataAdapter Phương thức Fill: đổ liệu từ nguồn liệu vào DataSet Phương thức Update: cập nhật liệu từ DataSet tới nguồn liệu Cách thực thi đối tượng DataAdapter Các ví dụ Trong C# ta xây dựng Windows Form dùng Data grid view để lấy liệu từ bảng KhachHang sở liệu QLDH Thực thi với câu lệnh Select Khai báo Net Data Provider cho SQL Server using System.Data.SqlClient; 106 Tạo đối tượng Connection, khởi gán chuỗi kết nối, mở kết nối //Tạo đối tượng Connection SqlConnection cnn = new SqlConnection(); //Truyền vào chuỗi kết nối tới sở liệu //Sử dụng Application.StartupPath để lấy đường dẫn tới thư mục chứa file chạy chương trình cnn.ConnectionString = (@"Data Source=DESKTOPCA4NHAP\SQLEXPRESS;Initial Catalog=QLDHang;Integrated Security=True"); cnn.Open(); // mở kết nối Khai báo đối tượng DataAdapter để Fill liệu vào table //Lấy toàn liệu từ bảng KhachHang String sql = "Select * from KhachHang"; SqlCommand com = new SqlCommand(sql, cnn); //bat dau truy van com.CommandType = CommandType.Text; SqlDataAdapter da = new SqlDataAdapter(com); DataTable dt = new DataTable(); //tạo kho ảo để lưu trữ liệu da.Fill(dt); // đổ liệu vào kho cnn.Close(); // đóng kết nối Gắn liệu lên DataGridView dataGridView1.DataSource = dt; //đổ liệu vào datagridview Thực cụ thể Visual Studio sau: Khởi động Visual Studio 2015 Tạo Form sau: Viết code using System; using System.Collections.Generic; using System.ComponentModel; 107 using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; namespace QLDH { public partial class frmKhachHang : Form { public frmKhachHang() { InitializeComponent(); } SqlConnection cnn = new SqlConnection(@"Data Source=DESKTOP-CA4NHAP\SQLEXPRESS;Initial Catalog=QLDH;Integrated Security=True"); private void ketnoicsdl() { cnn.Open(); string sql = "select * from KhachHang"; // lay het du lieu bang Khách hàng SqlCommand com = new SqlCommand(sql, cnn); //bat dau truy van com.CommandType = CommandType.Text; SqlDataAdapter da = new SqlDataAdapter(com); DataTable dt = new DataTable(); //tạo kho ảo để lưu trữ liệu da.Fill(dt); // đổ liệu vào kho cnn.Close(); // đóng kết nối data.DataSource = dt; //đổ liệu vào datagridview } private void frmKhachHang_Load(object sender, EventArgs e) { ketnoicsdl(); } private void btn_Exit_Click(object sender, EventArgs e) { Application.Exit(); } } } Chạy chương trình 108 Thực thi câu lệnh Inert Khởi tạo Connection Khởi tạo đối tượng Command thực thi câu lệnh Insert // Tạo câu lệnh truy vấn Insert lấy liệu từ Control Form thiết kế sql = "INSERT INTO KhachHang(HoDem,Ten,DiaChi,SoDienThoai,Email,GioiTinh) VALUES ("; sql += "N'" + txtHoDem.Text + "',N'" + txtTen.Text + "','" + txtDiaChi.Text + "',N'" + txtSoDienThoai.Text + "',N'" + txtEmail.Text + "')"; //Thực thi câu lệnh SQL sủ dụng đối tượng Command SqlCommand cmd = new SqlCommand(sql, con); cmd.ExecuteNonQuery(); Thực thi câu lệnh Update, Delete giống với Ínert 109 PHỤ LỤC HƯỚNG DẪN CÀI ĐẶT SQL SERVER 2008 EXPRESS 110 ... : Những khái niệm sở liệu I Cơ sở liệu gì? Cơ sở liệu kho chứa thông tin Có nhiều loại sở liệu, ta đề cập đến sở liệu quan hệ, kiểu sở liệu phổ biến Một sở liệu quan hệ: Chứa liệu bảng, cấu tạo... lập sở liệu điều khiển truy nhập sở liệu Trên thị trường phần mềm Việt Nam xuất nhiều phần mềm hệ quản trị sở liệu như: Microsoft Access, Foxpro, DB2, SQL Server, Oracle,.v.v… - Hệ quản trị sở liệu. .. máy sở liệu trì liệu sở liệu nhiều bảng ln ln qn Khi tính toàn vẹn tham chiếu tồn sở liệu, máy sở liệu ngăn cản ta xố ghi có ghi khác tham chiếu đến sở liệu Sau định nghĩa mối quan hệ sở liệu,