24/05/2018, 23:21

Xây dựng lớp xử lý dữ liệu

Khi đọc đến phần này, chắc hẳn các bạn cũng đã thực hiện khá nhiều trang web: trang danh sách khách hàng, trang thông tin sách, … Giờ đây, chúng ta tạm dừng lại, nhìn lại những kết quả mình đã làm. Bạn có thấy là ứng với mỗi trang web, ...

Khi đọc đến phần này, chắc hẳn các bạn cũng đã thực hiện khá nhiều trang web: trang danh sách khách hàng, trang thông tin sách, … Giờ đây, chúng ta tạm dừng lại, nhìn lại những kết quả mình đã làm. Bạn có thấy là ứng với mỗi trang web, chúng ta đều phải tạo chuỗi kết nối, thực hiện đọc bảng dữ liệu, viết xử lý liên kết dữ liệu…

Chỉ mỗi việc hiển thị dữ liệu trên trang Web, chúng ta đã viết khá nhiều dòng lệnh trên đó, chưa kể đến những xử lý khác sau này. Số lượng thao tác cần xử lý trên trang Web càng tăng, số lượng dòng lệnhcàng nhiều. Việc để lẫn lộn những đoạn code về truy cập dữ liệu và xử lý trên giao diện gây không ít khó khăn trong việc xây dựng, phát triển và bảo trì ứng dụng web.

Chính vì lý do đó, trong phần này, chúng tôi hướng dẫn các bạn xây dựng lớp xử lý và đối tượng thể hiện dữ liệu. Lớp xử lý đảm nhận trách nhiệm thực hiện các thao tác truy xuất và cập nhật dữ liệu.

Đối tượng thể hiện nhận dữ liệu, hiển thị dữ liệu trên trang Web và tiếp nhận thông tin từ người dùng. Việc phân chia công việc cụ thể cho từng đối tượng không những giúp cho chúng ta xây dựng và phát triển ứng dụng một cách có hiệu quả mà còn dễ dàng trong quá trình bảo trì, phù hợp với xu hướng phát triển phần mềm sử dụng các ngôn ngữ lập trình hiện đại.

Mô hình xử lý của ứng dụng

Thiết kế tổng quan

Để giúp các bạn dễ dàng theo dõi cấu trúc chi tiết của lớp xử lý lưu trữ dữ liệu (XL_BANG), chúng ta sẽ bắt đầu tìm hiểu thiết kế tổng quan của nó.

Như tên gọi của nó, lớp xử lý lưu trữ (XL_BANG) thực hiện các chức năng:

- Truy xuất dữ liệu từ cơ sở dữ liệu

- Thực hiện các câu lệnh Sql

Imports System.Data 
    Imports System.Data.OleDb 
    Module PHAN_MEM 
    Public Const Chuoi_lien_ket As String = _ 
    "Provider=Microsoft.JET.OLEDB.4.0;" 
    End Module 
    Public Class XL_BANG 
    Inherits DataTable 
    #Region "Khai báo biến thành viên" 
    #End Region 
    #Region "Danh sách các thuộc tính" 
    #End Region 
    #Region "Nhóm hàm khởi tạo đối tượng" 
    #End Region 
    #Region "Nhóm hàm cung cấp thông tin" 
    #End Region 
    #Region "Nhóm hàm xử lý tính toán" 
    #End Region 
    #Region "Xử lý sự kiện" 
    #End Region 
    End Class 
    

Nhóm từ khóa #Region và #End Region tạo ra các phân vùng giúp chúng ta dễ dàng quản lý các đoạn lệnh trong quá trình xây dựng lớp.

Phân vùng với Region

Như các bạn thấy, lớp XL_BANG được kế thừa từ lớp DataTable, đồng nghĩa với việc nó sẽ được thừa hưởng tất cả những "tài sản" (các thuộc tính, phương thức, …) từ lớp DataTable.

Trong lớp xử lý trên, chúng ta có thực hiện các thao tác truy xuất và cập nhật dữ liệu, do đó, chúng ta cần sử dụng bộ thư viện của ADO.Net. Bộ thư viện được sử dụng trong lớp xử lý này là System.Data.OleDb. Lẽ đương nhiên, khi xây dựng ứng dụng của riêng mình, tùy theo yêu cầu cụ thể của ứng dụng, các bạn hoàn toàn có thể chọn cho mình bộ thư viện khác, như System.Data.SqlClient chẳng hạn.

Chúng tôi chia các khai báo, xử lý thành 6 nhóm:

- Khai báo biến thành viên: Khai báo các biến thành viên của lớp đối tượng trong nhóm này.

- Danh sách các thuộc tính: Để đảm bảo tính bao bọc của phương pháp lập trình hướng đối tượng, chúng ta sử dụng các thuộc tính để thực hiện giao tiếp giữa biến thành viên với các xử lý bên ngoài lớp.

- Nhóm hàm khởi tạo đối tượng: Danh sách các hàm khởi tạo lớp đối tượng được thực hiện trong nhóm này.

- Nhóm hàm cung cấp thông tin: Các hàm cung cấp thông tin có được từ lớp đối tượng.

- Nhóm hàm xử lý tính toán: Các hàm, thủ tục, thực hiện các xử lý, tính toán theo yêu cầu phục vụ cho việc cung cấp thông tin, vận hành lớp đối tượng.

- Xử lý sự kiện: Các thủ tục xử lý sự kiện của lớp đối tượng

Cấu trúc chi tiết lớp XL_BANG

Khai báo biến thành viên

#Region "Khai báo biến thành viên" 
    'Đối tượng truy xuất cập nhật dữ liệu 
    Private WithEvents mBo_doc_ghi As OleDbDataAdapter 
    'Biến chuỗi chứa nội dung truy vấn dữ liệu 
    Private mChuoi_SQL As String = "" 
    'Biến chứa tên bảng muốn truy vấn 
    Private mTen_bang As String 
    'Biến kết nối dùng chung đến nguồn dữ liệu 
    Private Shared mKet_noi As OleDbConnection 
    'Biến chứa thông tin vị trí nguồn dữ liệu. 
    'Giá trị này phải được gán trước khi sử dụng lớp. 
    Public Shared Chuoi_CSDL As String 
    #End Region 
    

Danh sách các thuộc tính

Ứng với mỗi biến thành viên cần giao tiếp ra bên ngoài, chúng ta cung cấp thuộc tính tương ứng để làm việc.

#Region "Danh sách các thuộc tính" 
    Public Property Chuoi_SQL() As String 
    Get 
    Return mChuoi_SQL 
    End Get 
    Set(ByVal Value As String) 
    mChuoi_SQL = Value 
    End Set 
    End Property 
    
Public Property Ten_bang() As String 
    Get 
    Return mTen_bang 
    End Get 
    Set(ByVal Value As String) 
    mTen_bang = Value 
    End Set
    End Property 
    Public Shared Property Ket_noi() As OleDbConnection 
    Get 
    Return mKet_noi 
    End Get 
    Set(ByVal Value As OleDbConnection) 
    mKet_noi = Value 
    End Set 
    End Property 
    
'Cho biết số dòng đang hiển thị của DefaultView 
    Public ReadOnly Property So_dong() As Integer 
    Get 
    Return DefaultView.Count 
    End Get 
    End Property 
    #End Region
    

Nhóm hàm khởi tạo đối tượng

#Region "Nhóm hàm khởi tạo đối tượng" 
    Public Sub New() 
    MyBase.New() 
    End Sub 
    
'Thủ tục khởi tạo đọc toàn bộ bảng 
    Public Sub New(ByVal pTen_bang As String) 
    MyBase.New(pTen_bang) 
    mTen_bang = pTen_bang 
    Doc_bang() 
    End Sub 
    
'Thủ tục khởi tạo đọc bảng theo câu lệnh sql 
    Public Sub New(ByVal pTen_bang As String, ByVal pChuoi_SQL As String) 
    MyBase.New(pTen_bang) 
    mTen_bang = pTen_bang 
    mChuoiSQL = pChuoi_SQL 
    Doc_bang() 
    End Sub 
    #End Region 
    

Các bạn xem hàm Doc_bang trong nhóm hàm cung cấp thông tin

Nhóm hàm cung cấp thông tin

#Region "Nhóm hàm cung cấp thông tin" 
    'Thực hiện lấy cấu trúc và dữ liệu vào DataTable. 
    'Sau đó, phát sinh bộ lệnh cập nhật dữ liệu 
    Private Sub Doc_bang() 
    If mChuoi_SQL = "" Then mChuoi_SQL = "SELECT * FROM " & mTen_bang 
    If mKet_noi Is Nothing Then 
    mKet_noi = New OleDbConnection 
    mKet_noi.ConnectionString = _ 
    Chuoi_lien_ket & "Data Source=" & Chuoi_CSDL 
    End If 
    Try 
    mBo_doc_ghi = New _ 
    OleDbDataAdapter(mChuoi_SQL, mKet_noi) 
    mBo_doc_ghi.Fill(Me) 
    mBo_doc_ghi.FillSchema(Me, SchemaType.Mapped) 
    mBo_doc_ghi.SelectCommand.CommandText = _ 
    "Select * FROM " & mTen_bang 
    Dim Bo_phat_sinh As New _ 
    OleDbCommandBuilder(mBo_doc_ghi) 
    Catch ex As OleDbException 
    End Try 
    End Sub 
    #End Region 
    

Nhóm hàm xử lý tính toán

#Region "Nhóm hàm xử lý tính toán" 
    'Hàm cập nhật các thay đổi trên DataTable vào CSDL 
    Public Function Ghi() As Boolean 
    Dim ketqua As Boolean = True 
    Try 
    mBo_doc_ghi.Update(Me) 
    Me.AcceptChanges() 
    Catch e As Exception 
    Me.RejectChanges() 
    ketqua = False 
    End Try 
    Return ketqua 
    End Function
    'Lọc dữ liệu của DefaultView theo điều kiện lọc 
    Public Sub Loc_du_lieu(ByVal pDieu_kien As String) 
    Try 
    Me.DefaultView.RowFilter = pDieu_kien 
    Catch ex As Exception 
    End Try 
    End Sub 
    'Hàm thực hiện nội dung lệnh truyền vào. 
    '- Nếu thành công, trả về số mẩu tin được cập nhật 
    '- Nếu thành công, hàm trả về -1 
    Public Function Thuc_hien_lenh(ByVal Lenh As String) As Integer 
    Try 
    Dim Cau_lenh As New OleDbCommand(Lenh, mKet_noi) 
    mKet_noi.Open() 
    Dim ket_qua As Integer = Cau_lenh.ExecuteNonQuery() 
    mKet_noi.Close() 
    Return ket_qua 
    Catch ex As OleDbException 
    Return -1 
    End Try 
    End Function 
    'Hàm thực hiện nội dung lệnh tính toán thống kê 
    '- Nếu thành công, trả về kết quả thống kê 
    '- Nếu thành công, trả về Nothing 
    Public Function Thuc_hien_lenh_tinh_toan(ByVal _ 
    Lenh As String) As Object 
    Try 
    Dim Cau_lenh As New OleDbCommand(Lenh, mKet_noi) 
    mKet_noi.Open() 
    Dim ket_qua As Object = Cau_lenh.ExecuteScalar 
    mKet_noi.Close() 
    Return ket_qua 
    Catch ex As OleDbException 
    Return Nothing 
    End Try 
    End Function 
    #End Region
    

Nhóm hàm xử lý sự kiện

#Region "Xử lý sự kiện" 
    'Cập nhật giá trị cột AutoNumber làm khóa chính 
    Private Sub mBo_doc_ghi_RowUpdated _ 
    (ByVal sender As Object, ByVal e As _ 
    System.Data.OleDb.OleDbRowUpdatedEventArgs) _ 
    Handles mBo_doc_ghi.RowUpdated 
    If e.Status = UpdateStatus.Continue AndAlso _ 
    e.StatementType = StatementType.Insert Then 
    'Lay gia tri AutoNumber 
    If Me.PrimaryKey(0).AutoIncrement Then 
    Dim cmd As New OleDbCommand("Select @@IDENTITY", mKet_noi) 
    e.Row.Item(0) = cmd.ExecuteScalar() 
    e.Row.AcceptChanges() 
    End If 
    End If 
    End Sub 
    #End Region 
    

Xây dựng lớp xử lý nghiệp vụ

Dựa trên lớp xử lý lưu trữ (XL_BANG), xây dựng các lớp xử lý nghiệp vụ ứng với mỗi bảng trong cơ sở dữ liệu (CSDL).

Sơ đồ lớp XL_XXX

Trong đó:

Lớp XL_BANG: Đã được xây dựng ở phần trên.

Ký hiệu XXX: Tên các bảng tương ứng trong CSDL.

XL_BANG

XL_XXX

Các lớp xử lý nghiệp vụ sẽ có mẫu chung như XL_CHU_DE mẫu dưới đây.

Cấu trúc bảng chủ đề (CHU_DE)

Field Name Fielde Type Field Size Description
Mcd Autonumber Long Integer
Ten_chu_de Text 50
Ghi_chu Text 200

Chi tiết lớp XL_CHU_DE

Imports System.Data 
    Imports System.Data.OleDb 
    Public Class XL_CHU_DE 
    Inherits XL_BANG 
    #Region "Khai báo phương thức khởi tạo" 
    Public Sub New() 
    MyBase.New("CHU_DE", "Select * From CHU_DE") 
    End Sub 
    Public Sub New(ByVal pMcd As Integer) 
    MyBase.New("CHU_DE", "Select * From CHU_DE " & _ 
    "Where Mcd = " & pMcd) 
    End Sub 
    Public Sub New(ByVal pChuoi_SQL As String) 
    MyBase.New("CHU_DE", pChuoi_SQL) 
    End Sub 
    #End Region 
    #Region "Khai báo phương thức xử lý và tìm kiếm" 
    Public Sub Tim(ByVal pDong_dieu_kien As DataRow) 
    Dim chuoi_Dk As String = "" 
    Dim mang_Dk As New ArrayList 
    Dim so_Pt As Byte = 0 
    If Not IsDBNull(pDong_dieu_kien("Ten_chu_de")) Then 
    mang_Dk.Add("Ten_chu_de LIKE '*" & _ 
    pDong_dieu_kien("Ten_chu_de ") & "*'") 
    End If 
    'Tiếp theo cho những điều kiện khác 
    '……
    If mang_Dk.Count > 0 Then 
    Dim i As Integer 
    For i = 0 To mang_Dk.Count - 1 
    If i = 0 Then 
    chuoi_Dk = mang_Dk(i) 
    Else 
    chuoi_Dk += " AND " + mang_Dk(i) 
    End If 
    Next 
    Loc_du_lieu(chuoi_Dk) 
    End If 
    End Sub 
    #End Region 
    End Class
    

Sử dụng lớp xử lý nghiệp vụ

Sau khi thiết kế lớp xử lý hoàn tất, việc hiển thị dữ liệu trên màn hình bây giờ khá đơn giản :

Hiển thị các sách có trong bảng SACH

'Khai báo bảng sách: Bang_sach 
    Dim Bang_sach As XL_SACH 
    
Private Sub Page_Load(…, e …) Handles MyBase.Load 
    'Put user code to initialize the page here 
    If Not IsPostBack Then 
    Lien_ket_du_lieu() 
    End If 
    End Sub 
    Public Sub Lien_ket_du_lieu() 
    XL_BANG.Chuoi_CSDL = Server.MapPath("../Du_lieu/QlBanSach.mdb") 
    Bang_sach = New XL_SACH 
    Ds_Sach.DataSource = Bang_sach 
    Ds_Sach.DataBind() 
    End Sub
    

Nếu muốn hiển thị các sách mới nhập:

Public Sub Lien_ket_du_lieu() 
    XL_BANG.Chuoi_CSDL = Server.MapPath("../Du_lieu/QlBanSach.mdb") 
    Bang_sach = New XL_SACH 
    Bang_sach.DefaultView.Sort = "Ngay_Cap_nhat desc" 
    Ds_Sach.DataSource = Bang_sach 
    Ds_Sach.DataBind() 
    End Sub 
    

Nếu muốn hiển thị 10 cuốn sách mới nhất:

Public Sub Lien_ket_du_lieu() 
    XL_BANG.Chuoi_CSDL = Server.MapPath("../Du_lieu/QlBanSach.mdb") 
    Bang_sach = New XL_SACH("Select Top 10 * " & _ 
    "From SACH " & _ 
    "Order By Ngay_cap_nhat desc") 
    Ds_Sach.DataSource = Bang_sach 
    Ds_Sach.DataBind() 
    End Sub 
    

Nếu muốn hiển thị 10 cuốn sách mới nhất của chủ đề có mã là 5:

Public Sub Lien_ket_du_lieu() 
    XL_BANG.Chuoi_CSDL = Server.MapPath("../Du_lieu/QlBanSach.mdb") 
    Bang_sach = New XL_SACH("Select Top 10 * " & _ 
    "From SACH " & _ 
    "Where Mcd = 5 " & _ 
    "Order By Ngay_cap_nhat desc") 
    Ds_Sach.DataSource = Bang_sach 
    Ds_Sach.DataBind() 
    End Sub
    

Kết quả hiển thị: (10 sách mới nhất)

Màn hình thông tin sách

Trong bảng SACH, chúng ta chỉ có thông tin về Mã chủ đề (Mcd), Mã nhà xuất bản (Mnxb), để lấy được tên chủ đề, tên nhà xuất bản như kết quả trong hình minh họa trên, chúng ta cần bổ sung các điều khiển cần thiết như hình bên dưới và thực hiện như sau:

Hiệu chỉnh thủ tục Lien_ket_du_lieu như sau:

Public Sub Lien_ket_du_lieu() 
    XL_BANG.Chuoi_CSDL = 
    Server.MapPath("../Du_lieu/QlBanSach.mdb") 
    Dim lenh_Sql As String 
    lenh_Sql = "SELECT SACH.*, " & _ 
    "Ten_nha_xuat_ban, Ten_chu_de " & _ 
    "FROM (NHA_XUAT_BAN NXB INNER JOIN SACH " & _ 
    "ON NXB.Mnxb = SACH.Mnxb) " & _ 
    "INNER JOIN CHU_DE CD ON CD.Mcd = SACH.Mcd" 
    Bang_sach = New XL_SACH(lenh_Sql) 
    Ds_Sach.DataSource = Bang_sach 
    Ds_Sach.DataBind() 
    End Sub 
    

Kinh nghiệm giảng dạy:

Bài xây dựng lớp xử lý dữ liệu học viên đã được học trong phần VB.Net. Trong phần này, giáo viên dành một ít thời gian ôn lại, giúp học viên củng cố lại kiến thức về lập trình hướng đối tượng và cách xây dựng các lớp đối tượng xử lý dữ liệu.

Giáo viên hướng dẫn cho học viên xây dựng một lớp xử lý (khách hàng chẳng hạn), sử dụng lớp xử lý vừa xây dựng để lấy dữ liệu.

Dựa vào lớp xử lý đã hướng dẫn cho học viên, giáo viên yêu cầu học viên tạo các lớp xử lý còn lại.

0