24/05/2018, 20:21

Các đối tượng truy cập dữ liệu

Sử dụng mô hình đối tượng DAO. Sử dụng DAO để làm việc với dữ liệu. Tạo đối tượng để thao tác ...

  • Sử dụng mô hình đối tượng DAO.
  • Sử dụng DAO để làm việc với dữ liệu.
  • Tạo đối tượng để thao tác với cấu trúc cơ sở dữ liệu.

Ta có thể dùng DAO( đối tượng truy vấn cơ sở dữ liệu –DataAccess Object) để thao tác với cơ sở dữ liệu thông qua lập trình với Visual Basic. Với DAO, ta có thẻ thi hành các câu truy vấn, cập nhật giá trị trong các bảng cơ sở dữ liệu và tạo cấu trúc cơ sở dữ liệu bao gồm các bảng , các câu truy vấn chưa sẵn mối quan hệgiữa các bảng.

DAO được các nhà lập trình Visual Basic sử dụng để truy cập các cơ sở dữ liệu trên máy tính cá nhân hay Client / Server. Nhưng với sự ra đời của ADO, giờ đây nó chỉ thích hợp để dùng cơ sở dữ liệu Jet mà thôi. Còn đối với việc phát triển các hệ Client / Server mới, chủ yếu ta tận dụng thế mạnh của ADO.

Mô hình đối tượng DAOkhá phức tạp với hàng trăm yếu tố. Hàng tá kiểu tập hợp chứa hàng tá đối tượng, mỗi đối tượng lại có thuộc tính, phương thức và các đối tượng con của riêng nó.

Sau đây là mô hình cây phân cấp của đối tượng DAO:

Mô hình cây phân cấp DAO, trình bày mối qua hệ giữa các đối tượng cơ sở dữ liệu.

Một cách để phân loại sự phức tạp của mô hình đối tượng DAO là bắt đầu bằng đối tượng Databasevà xem xét các tập hợp của nó. Tập hợp là những bộ các đối tượng quan hệ với nhâu; đối tượng Database có các tập hợp các đối tượng như sau:

Thông qua các tập hợp sở hữu bởi đối tượng Database,ta có thể thao tác trên dữ liệu và cấu trúc của một cơ sở dữ liệu, tạo các đối tượng cơ sở dữ liệu mới, và kiểm tra cấu trúc và dữ liệu chứa trong một cơ sở dữ liệu.

Trong lập trình DAO, có một tập hợp cốt lõi gồm các kỹ thuật thông dụng được sử dụng gần như cho mọi chương trình. Chúng bao gồm:

  • Thi hành câu truy vấn SELECT để lấy về các dữ liệu từ cơ sở dữ liệu
  • Duyệt qua từng mẩu tin trong một recordset.
  • Thi hành câu truy vấn hành động (bao gồm các câu truy vấn update,delete và append).
  • Sửa đổi cấu trúc cơ sở dữ liệu.
  • Xử lý lỗi phát sinh bởi truy cập cơ sở dữ liệu. Kỹ thuật này làm việc rất tốt với cơ sở dữ liệu Access.

Lập trình với đối tượng

Để sử dụng tốt các đối tượng của DAO bạn phải hiểu căn bản về đối tượng. Tất cả đối tượng bao gồm các phần tử sau:

  • Các thuộc tính: là những dữ liệu gắn liền với đối tượng gồm 1 kiểu dữ liệu chuẩn (như interger, string..) hay 1 tập hợp đối tượng trong nó. Ví dụ : Recordset chứa trong nó là tập hợp Fields.
  • Các phương thức : là các hành động mà đối tượng có thể thi hành. Chúng có thể hoạt động như các hàm ( trả về dữ liệu ) hay các thủ tục con
  • Các sự kiện: là các thông điệp mà đối tượng có thể gửi đến các ứng dụng đang sử dụng đối tượng. DAO cũng có các sự kiện riêng.

Sử dụng điều khiển DAO Data

Ta có thể sử dụng điều khiển DAO data để kết nối với một cơ sở dữ liệu Jet của Microsoft. Mặc dù với sự xuất hiện của điều khiển mạnh hơn, ADO Data, việc sử dụng điều khiển DAO Data bị giảm bớt, nhưng vẫn tồn tại lý do để sử dụng điều khiển cổ điển DAO data. Ngoài ra, nó còn có khả năng kết nối với các nguồn dữ liệu như các tập tin dBASE, văn bản, bảng tính Excel mà không cần phải dùng ODBC (nối kết cơ sở dữ liệu mở).

Nguyên lý cơ bản của điều khiển DAO tương tự với điều khiển ADO Data, chỉ khác ở phần chi tiết. Để sử dụng điều khiển, ta gán tên của tập tin cơ sở dữ liệu vào thuộc tính DatabaseName rồi chọn một bảng hoặc một nguồn dữ liệu nào khác trong thuộc tính RecordSource. Sau cùng, ta sẽ ràng buộc các điều khiển giao diện người sử dụng như là các hộp văn bản với điều khiển bằng cách chỉ ra giá trị cho thuộc tính DataSource và DataField của từng điều khiển giao diện người sử dụng

Sử dụng thuộc tính Connect của điều khiển DAO Data để truy cập nguồn dữ liệu bên ngoài

Thuộc tính Connectxác định loại cơ sở dữ liệu kết nối đền điều khiển Data.Theo mặc định, thuộc tính này được chỉ định là Microsoft Access., nhưng ta có thể sửa đổi chỉ định này nếu ta muốn kết nối với một kiểu dữ liệu không phải Access. Các kiểu dữ liệu này được gọi là các kiểu dữ liệu bên ngoài.

Jet hỗ trợ các kiểu cơ sở dữ liệu trên máy tính cá nhân sau đây:

  • dBASE III,IV và 5.0
  • Phiên bản Excel 3.0, 4.0, 5.0 và 8.0
  • Phiên bản Foxpro 2.0, 2.5, 2.6 và 3.0
  • Lotus spreadsheet với định dạng WK1, WK3 và WK4.
  • Phiên bản Paradox 3.x, 4.x và 5.x
  • Tập tin văn bản ASCII có phân cách.

Sử dụng điều khiển Data để nối với file excel 5.0 là excel-db.xls

Thuộc tính : Connect = Excel 5.0; DatabaseName= excel-db.xls; RecordSource = Sheet$ ..

DAO không hỗ trợ một số hoạt động trên cơ sở dữ liệu bên ngoài. Đặc biệt, cơ sở dữ liệu đó không hỗ trợ các thủ tục DAO như tạo cơ sở dữ liệu, trường , định nghĩa truy vấn. Chúng chỉ hỗ trợ với cơ sở dữ liệu Jet.

DAO được dùng chủ yếu để thao tác trên dữ liệu trong một cơ sở dữ liệu đã có. Thi hành truy vấn, cập nhật mẩu tin, và thi hành các hoạt động bảo trì là sở trường của DAO.

Dùng đối tượng DataBase để kết nối với một CSDL

Đối tượng Databaselà nơi để ứng dụng bắt đầu phần lớn các truy cập cơ sở dữ liệu của nó. Để dùng đối tượng Database,ta bắt đầu lập tham chiếu đến Microsoft DAOs trong menu ProjectReferences của Visual Basic .. Điều này sẽ cho phép ứng dụng tăng cường truy cập đến mọi đối tượng do DAO cung cấp.

Để thực hiện điều này, ta theo các bước sau:

  1. Từ menu Project,chọn References.
  2. Hộp thoại References xuất hiện. Từ danh sách các thư viện, chọn vào hộp đánh dấu “Microsoft DAO 3.5.1 Object Library”.
  3. Nhấn OK. Giờ đây, ta có thể dùng đối tượng được cung cấp bởi thư viện đối tượng DAO.

Bước kế tiếp là khai báo một biến đối tượng cơ sở dữ liệu trong chương trình :

Dim db As Database

Nếu ứng dụng được thiết kế để làm việc với một cơ sở dữ liệu duy nhất, tốt nhất ta nên khai báo biến Databaseở mức mô-dun của biểu mẫu chính của ứng dụng.

Nếu nhiều biểu mẫu ứng dụng cần truy cập đến một cơ sở dữ liệu, ta nên tạo một lớp quản lý kết nối đến cơ sở dữ liệu.

Sử dụng phương thức OpenDatabase để tạo một đối tượng Database

Đây là phương thức của đối tượng Workspace

Ta dùng phương thức OpenDatabase để tạo một đối tượng Database. Phương thức này trả về một đối tượng Database( do đó, trước khi dùng OpenDatabase,ta phải khai báo một biến đối tượng có kiểu là Databaseđể chứa giá trị trả về của phương thức ).

Dim db As Database

Set db = OpenDatabase("....DB
ovelty.mdb")

Msgbox "The database " & db.Name & "is now open."

Phương thức OpenDatabase có tham số bắt buộc – tên của cơ sở dữ liệu ta muốn mở. Cú pháp : (Đối tượng Workspace được mặc định )

OpenDatabase(dbName, [options], [readonly],[connect])
Tham số Mô tả
Options Nếu tham số này là true,cơ sở dữ liệu mở trong chế độ loại trừ;không ai có thể mở cơ sở dữ liệu trong chế độ loại trừ. Nếu giá trị này là false, những người khác có thể mở cơ sở dữ liệu.
Readonly Nếu tham số này là True, ta không thể sửa đổi cơ sở dữ liệu.
Connect một chuỗi chỉ ra cách thức kết nối với cơ sở dữ liệu; chuỗi thườngchỉ được dùng cho những nguồn dữ liệu Client / ServerODBC.

Sử dụng phương thức Execute để thi hành truy vấn hành động

Sử dụng Execute của đối tượng Database để thi hành một câu lệnh SQL trên SQL. Phương thức này nên dùng để:

  • Cập nhật, xoá hay sao chép mẩu tin (trong Access / Jet, ta gọi là các truy vấn hành động )
  • Sửa cấu trúc dữ liệu

Các câu truy vấn SELECT được thi hành qua phương thức OpenRecordset của Database.

Sử dụng đối tượng Recordset

Ta sử dụng đối tượng Recordsetđể thao tác với các mẩu tin trong DAO. Đối tượng Recordsetcung cấp một giao diện hướng đối tượng cho mô hình cơ sở dữ liệu quan hệ liên quan đến các bảng được chia thành những mẩu tin và trường.

Để tạo một recordset, ta chủ yêu sử dụng phương thức OpenRecordset.

Sử dụng phương thức OpenRecordset để tạo một đối tượng Recordset

Trong DAO, các đối tượng Database,Connection,QueryDef,TableDef,Recordset đều có phương thức OpenRecordset. Tất cả đều được dùng với cùng mục đích; truy cập dữ liệu chứa trong cơ sở dữ liệu.

Phương thức OpenRecordset thực sự là một hàm trả về một đối tượng Recordset, ta cần khai báo một đối tượng Recordset trước khi sử dụng OpenRecordset.

Dim db As Database

Dim rs As Recordset

Set db = OpenDatabase("....db
ovelty.mdb") Set rs = db.OpenRecordset("tblCustomer")

Tham số bắt buộc duy nhất của phương thức OpenRecordset là nguồn dữ liệu. Đây là chuỗi ký tự, theo nguyên tắc là tên của một bảng hoặc một định nghĩa truy vấn chứa sẵn. Nhưng nó cũng có thể là một câu lệnh SELECT SQL: Dim db As Database

Dim rs As Recordset

Set db = OpenDatabase("....db
ovelty.mdb")

Set rs = db.OpenRecordset("SELECT * FROM tblCustomer" &_

" Order By [LastName]")

Tránh dùng dấu trích dẫn

Ta thường có câu lệnh SQL:

SELECT * FROM tblCustomer WHERE [LastName]="Smith"

Làm thế nào để đưa vào OpenRecordset mà không bị nhầm dấu ":

Giải pháp sử dụng dấu đơn :

Dim db As Database

Dim rs As Recordset

Set db = OpenDatabase("....db
ovelty.mdb")

Set rs = db.OpenRecordset("SELECT * FROM tblCustomer" & _

" WHERE [LastName]='Smith'")

Nếu tên người sử dụng là nhập vào từ text box txtLastName.Text thì đưa vào thế nào :

Dim db As Database

Dim rs As Recordset

Set db = OpenDatabase("....db
ovelty.mdb")

Set rs = db.OpenRecordset("SELECT * FROM tblCustomer" & _

" WHERE [LastName]='" & txtLastName.Text &"'")

Chỉ ra các tuỳ chọn cho Recordset

Tham số Options của phương thức OpenRecordset xác định một số cách thức thao tác với mẩu tin.

Hằng Ý n g hĩa
dbOpentable Trong một workspace của Microsoft Jet, tạo một đối tượngRecordset kiểu bảng ( bảng được đánh chỉ mục chỉ sử dụng một bảng )
dbOpenDynamic Trong một workspace kiểu ODBCDirect, mở một đối tượngRecordset kiểu dynamic ( cập nhật được dữ liệu khi người khác sửa đổi và truy vấn dữ liệu qua nhiều bảng )
dbOpenDynaset Mở một đối tượng kiểu Dynaset ( tham chiếu đến recordsetcủa nhiều bảng hoăc từ nhiều cơ sở dữ liệu khác)
dbOpenForwardonly Mở một đối tượng Recordset mà con trỏ của nó chỉ có thể dichuyển tới

Đối tượng Fieldthể hiện một trường trong một cấu trúc dữ liệu. Các đối tượng TableDef, Recordset, Relation Indexđều chứa các tập hợp trường.

Ta có thể lấy giá trị của một trường bằng cách kiểm tra giá trị của thuộc tính Value của một đối tượng Field . (Bởi vì thuộc tính Valuelà thuộc tính mặc định của đối tượng Field,ta chỉ cần tham chiếu đến đối tượng Field;ta không nhất thiết phải tham chiếu tường minh đến thuộc tính Value).

Sau khi tạo xong một đối tượng Recordset, ta có thể dùng các phương thức duyệt để di chuyển qua từng mẩu tin trong recordset. Ta chủ yếu thực hiện điều này trong trường hợp cần lấy về dữ liệu từ mọi mẩu tin trong một recordset, mặc dù ta còn có thể sử dụng chúng để cho phép người sử dụng chỉ duyệt qua các mẩu tin.

Các phương thức duyệt của một đối tượng Recrdsetgồm có:

  • MoveFirst: di chuyển đến mẩu tin đầu tiên trong recordset.
  • MoveNext : di chuyển đến mẩu tin kế tiếp trong recordset.
  • MovePrevious : di chuyển về mẩu tin trước đó trong recordset.
  • MoveLast: di chuyển đến mẩu tin cuối cùng trong recordset.
  • Move: di chuyển một số mẩu tin đã được chỉ định trước.

Sử dụng BOF và EOF để duyệt qua Recordset

Ngoài các phương thức trên, đối tượng Recordsetcung cấp 2 thuộc tính cho ta biết khi ta di chuyển về đầu hoặc về cuối recordset.

  • Thuộc tính EOF(endoffile) True khi ta di chuyển quá mẩu tin cuối cùng của recordset.
  • Thuộc tính BOF(beginoffile)True khi ta di chuyển đến một vị trí trước mẩu tin thứ nhất trong recordset.
BOF
Mẩu tin 1
Mẩu tin 2...
EOF

Do until EOF

‘perform action on the data or read values from fields rs.MoveNext

Loop

Dùng BOF và EOF để xác định một Recordset có rỗng hay không

Thuộc tính BOF EOF luôn có sẵn, thậm chí trong một recordset không có mẩu tin. Trên thực tế, cách tốt nhất để xem recordsetcó chứa mẩu tin hay không là kiểm tra giá trị của cả hai thuộc tính EOF BOF. Nếu cả BOF EOF đều là True, recordsetkhông chứa mẩu tin.

Dùng thuộc tính RecordCout để xác định số mẩu tin trong một recordset

Ta dùng thuộc tính RecordCount để xác định số mẩu tin trong một recordset. Nhưng lưu ý rằng giá trị của RecordCount sẽ không hợp lệ nếu ta chưa chuyển đến mẩu tin cuối cùng trong Recordset.

Bởi vì Jet xử lý truy vấn trên 2 giai đoạn. Giai đoạn đầu chỉ trả về dữ liệu đủ cho ứng dụng hoạt động mà không bị chậm trễ trong xử lý. Giai đoạn thứ hai thi hành bên dưới, trả về toàn bộ dữ liệu yêu cầu để truy vấn hoàn chỉnh. Jet thực hiện điều này chỉ nhằm mục tiêu tăng khả năng hoạt động, vì vậy, việc thi hành ứng dụng không bị cản trở trong khi chờ trả về một khối lượng dữ liệu lớn. Ta không điều khiển trực tiếp quá trình này, nhưng ta cần biết rằng nó tồn tại và cách thức làm việc với nó khi ta muốn biết chính xác có bao nhiêu mẩu tin đang có trong một recordset chẳng hạn.

Option Explicit
' References: Microsoft DAO 3.51 Object Library
    Dim db As Database
    Private Sub Form_Load()
    Set db = OpenDatabase("....db
ovelty.mdb") End Sub
    Private Sub cmdCount_click() Dim rs As Recordset
    Set rs = db.OpenRecordset("tblInventory")
    rs.MoveLast
    
    MsgBox "There are " & rs.RecordCount & _
    " items in inventory.", vbInformation
    End Sub
    
Nếu muốn xác định số mẩu tin là 0 dùng thuộc tính BOF và EOF thay vì dùng RecordCount

Dùng phương thức Edit để sửa đổi giá trị trong một mẩu tin

Ta có thể sửa đổi mâu tin hiện hành trong một đối tượng Recordsetcập nhật được bằng cách dùng phương thức Edit Updatecủa recordset. muống sửa đổi giá trị của một trường trong một Recordset,theo các bước sau :

  1. Dùng các phương thức duyệt của đối tượng Recordset để di chuyển đến mẩu tin cần sửa đổi.
  2. Thi hành phương thức Edit của recordset.
  3. Dùng tập hợp Fieldscủa đối tượng Recordsetđể gán giá trị cho trường trong mẩu tin :

    rs.Fields("LastName")= "Smith"

    rs!LastName = "Smith"
  4. Lưu mẩu tin vào cơ sở dữ liệu bằng cách dùng phương thức Update của Recordset.

Sử dụng phương thức AddNew và Update để tạo mẩu tin mới

Ta có thể tạo một mẩu tin mới trong đối tượng Recordsetcập nhật được bất kỳ bằng cách dùng phương thức AddNew Update. Tạo một mẩu tin mới trong một recordsetlà quá trình 3 bước:

  1. Thi hành phương thức AddNew của RecordSet. Nó thêm một mẩu tin mới, trắng vào cuối của recordset.
  2. Gán giá trị cho mẩu tin mới bằng cách sử dụng câu lệnh gán mà ta thường dùng với các trường cơ sở dữ liệu.
  3. Dùng phương thức Update để ghi mẩu tin vào cơ sở dữ liệu.
Option Explicit
    ' References: Microsoft DAO 3.51 Object Library
    Private Enum TextBoxes txtProduct = 0 txtCatalogNumber = 1 txtWholesalePrice = 2 txtRetailPrice = 3
    End Enum
    Private db As Database Private rs As Recordset Private x As Integer Private Sub Form_Load()
    Set db = OpenDatabase("....DB
ovelty.mdb") Set rs = db.OpenRecordset("tblInventory")
    For x = txtProduct To txtRetailPrice
    TextBox(x).Enabled = False
    Next x
    cmdSave.Enabled = False cmdNew.Enabled = True End Sub
    Private Sub cmdNew_Click()
    ' Create a new record rs.AddNew
    ' Enable data entry controls
    For x = txtProduct To txtRetailPrice
    TextBox(x).Enabled = True Next x TextBox(txtProduct).SetFocus cmdSave.Enabled = True cmdNew.Enabled = False
    End Sub
    Private Sub cmdSave_Click()
    ' Map UI controls to fields rs.Fields("Product") = TextBox(txtProduct)
    rs.Fields("CatalogNumber") = TextBox(txtCatalogNumber) rs.Fields("WholesalePrice") = TextBox(txtWholesalePrice) rs.Fields("RetailPrice") = TextBox(txtRetailPrice)
    ' Commit data to database rs.Update
    ' Clear out UI
    For x = txtProduct To txtRetailPrice TextBox(x).Text = "" TextBox(x).Enabled = False
    Next x
    cmdSave.Enabled = False cmdNew.Enabled = True
    End Sub
    

Sử dụng AppendChunk để nối dữ liệu vào một trường nhị phân

Ta có thể chứa dữ liệu nhị phân vào trong cơ sở dữ liệu. Dữ liệu nhị phân bao gồm hình ảnh hay tập tin âm thanh – nghĩa là bất kỳ những gì ta muốn chứa không chỉ là giá trị số hay chuỗi ký tự.

Microsoft Access tham chiếu đến trường nhị phân như là trường OLE Object (đối tượng OLE). Ngoài ra, ta có thể dùng kỹ thuật AppendChunk này để nối thêm dữ liệu vào một trường memo cũng như trường nhị phân. Các phương thức thao tác trên trường nhị phân tồn tại gần như đồng dạng trong cả 3 mô hình đối tượng truy cập dữ liệu –DAO, RDO và ADO.

Khi ta gán một giá trị cho trường nhị phân trong chương trình, ta cần thi hành một số bước bổ sung để lấy dữ liệu trong trường. Bởi vì dữ liệu nhị phân không có chiều dài cố định như các kiểu dữ liệu khác; một mẩu dữ liệu nhị phân có thể lên đến hàng mega- byte hoặc hơn.

Vì vậy, để đặt một mẩu dữ liệu nhị phân trong cơ sở dữ liệu, trước hết ta phải chia nó thành nhiều đoạn dữ liệu nhị phân, ta nối nó vào trường bằng cách dùng phương thức AppendChunkcủa đối tượng Fieldcủa recordset.

Sử dụng phương thức Close để đóng Recordset

Ta thực hiện điều này khi chương trình hoàn tất sử dụng đối tượng Recordset:

rs.Close

Điểm đặc biệt quan trọng khi đóng một đối tượng Recordsetlà nếu đối tượng đặt một khoá (lock) trên bảng . Đóng một Recordsetsẽ nhả khoá ứng dụng thiết lập trên đối tượng cơ sở dữ liệu, cho phép người sử dụng khác truy cập đến nó.

Lưu ý rằng trong DAO,Workspace, Connection, Database và QueryDef đều có phương thức Close

Sau khi tạo một cơ sở dữ liệu và nhập liệu, ta cần một cách để định vị các mẩu tin riêng rẽ trong một recordset.Quá trình định vị một mẩu tin riêng rẽ trong recordset theo một tiêu chí chỉ định trước nào đó trong chương trình gọi là tìm kiếm.

Tìm kiếm khác với truy vấn là một truy vấn thì trả về một recordset.Tìm kiếm duyệt qua các mẩu tin trong recordset hiện hành để tìm ra một mẩu tin thoả mãn tiêu chí chỉ định.

Có một số kỹ thuật tìm kiếm dữ liệu. Sử dụng phương thức nào là tuỳ thuộc vào loại cấu trúc dữ liệu ta đang truy cập :

  • Nếu ta đang làm việc với một recordset, ta dùng các phương thức Find FindFirst, FindNext, FindLastFindPrevious.
  • Nếu ta truy cập trực tiếp đến một recordset kiểu bảng, ta có thể dùng phương thức Seekđể định vị mẩu tin. Phương thức này khó lập trình hơn, nhưng nó nhanh hơn vì ta có thể dùng một chỉ mục của bảng với phương thức Seek.

Sử dụng phương thức Find để định vị mẩu tin trong một recordset

Để tìm một mẩu tin trong một Recordset, ta dùng một trong bốn phương thức tìm kiếm của đối tượng Recordset :

  • FindFirst
  • FindLast
  • FindNext
  • FindPrevious

Cú pháp của bốn phương thức như nhau - để sử dụng một trong bốn phương thức tìm kiếm này, ta truyền một mệnh đề WHERE của SQL vào phương thức chỉ ra thông tin ta cần tìm kiếm. Sau khi thi hành phương thức, mẩu tin hiện hành trong đối tượng Recordsettrở thành mẩu tin thoả mãn tiêu chí WHERE. Nếu tìm kiếm không định vị được mẩu tin yêu cầu, thuộc tính NoMatchcủa đối tượng Recordsetcó giá trị là True.

Loại phương thức ta dùng cũng xác định cách thức tìm thấy mẩu tin. Ví dụ, nếu dùng FindFirst, bộ máy cơ sở dữ liệu sẽ di chuyển đến mẩu tin thứ nhất trong recordset thoả tiêu chí. FindNext FindPrevious, ngược lại, tìm các mẩu tin hiện hành.

Điểm quan trọng cần lưu ý là, khác với một câu truy vấn SELECT của SQL, tìm kiếm không sinh ra một recordset. Khi bộ máy cơ sở dữ liệu tìm ra mẩu tin thoả tiêu chí tìm kiếm, nó di chuyển đến mẩu tin đó; mẩu tin trở thành mẩu tin hiện hành. Nếu không có mẩu tin tìm thấy, mẩu tin hiện hành sẽ được giữ nguyên và thuộc tính NoMatch của đối tượng Recordsetcó giá trị là True.

Sử dụng phương thức Seek để thi hành tìm kiếm theo chỉ mục

Để tiến hành một tìm kiếm trên một chỉ mục, trước hết bảng phải có một chỉ mục.

Ví dụ sau đây, giả định rằng ta có một bảng tblCustomer với một chỉ mục trên trường LastName. Tên của chỉ mục là LastNameIndex.

Option Explicit
    ' References MS DAO 3.51 Object Library
    Private db As Database Private rs As Recordset Private Sub Form_Load()
    Set db = OpenDatabase("....db
ovelty.mdb")
    Set rs = db.OpenRecordset("tblCustomer", dbOpenTable) End Sub
    Private Sub cmdSeek_Click() rs.Index = "LastNameIndex" rs.Seek "=", txtLastName.Text If rs.NoMatch Then
    ' not found
    MsgBox "No customer by that name was found.", vbExclamation
    Else
    ' return info
    MsgBox rs!Address & vbCrLf & _ rs!City & ", " & rs!State & " " & _ rs!Zip & vbCrLf & _
    rs!Phone, _
    vbInformation, _
    rs!FirstName & " " & rs!LastName
    End If
    End Sub
    

Điểm hạn chế của phương thức Seek là khả năng tìm kiếm trên một trường duy nhất và nó phải được đánh chỉ mục. Ngoài ra nó chỉ sử dụng các toán tử sau : >;<;>=;<=;=

Khác với phương thức Seek , vốn hạn chế thì phương thức Find cho phép ta sử dụng các toán tử có sẵn của SQL như Like , in .

Lặp qua suốt tập hợp Indexes của TableDef

Để xác định các chỉ mục tồn tại trong một bảng, ta có thể lặp qua suốt tập hợp Indexes của đối tượng TableDef.

Option Explicit
    ' References MS DAO 3.51 Object Library
    Private db As Database Private rs As Recordset Private Sub Form_Load()
    Set db = OpenDatabase("....db
ovelty.mdb") End Sub
    Private Sub cmdShowIndexes_Click() Dim td As TableDef
    Dim ind As Index
    Dim f As Field
    Set td = db.TableDefs("tblCustomer") For Each ind In td.Indexes
    Debug.Print ind.Name
    For Each f In ind.Fields
    Debug.Print " On field: " & f.Name
    Next Next End Sub
    
Có thể dùng đoạn chương trình tương tự như trên để lặp qua suốt các tập hợp khác của DAO. Ví dụ, có thể dùng chương trình này để xem tất cả cơ sở dữ liệu trong một workspace, các định nghĩa truy vấn QueryDef trong một cơ sở dữ liệu, hoặc là các trường trong một TableDef.

Sử dụng thuộc tính Bookmark để ghi nhớ vị trí trong một Recordset

Khi ta tiến hành các tác vụ trên một đối tượng Recordset,ta thường di chuyển đây đó trong recordset. Dùng thuộc tính Bookmarkcủa đối tượng Recordsetđể giữ lại một vị trí sao cho ta có thể quay lại ví trí đó sau này.

Thuộc tính Bookmarkcho ta một cách hiệu quả di chuyển giữa hai hay nhiều mẩu tin. Sử dụng bookmark thì nhanh hơn là lặp đi lặp lại phương thức Findđể di chuyển qua từng mẩu tin.

Mỗi mẩu tin trong một recordsetcó thể đánh dấu bookmarkđược có một số hiệu bookmark duy nhất để ta có thể đọc ra hay ghi vào tại một thời điểm bất kỳ. Tuy nhiên, bookmarkkhông được chứa trong cơ sở dữ liệu; nó được phát sinh tự động khi một đối tượng recordsetđược tạo và bị huỷ bỏ khi đối tượng recordsetbị huỷ.

Để sử dụng bookmark,ta theo các bước sau:

  1. Di chuyển đến vị trí trong recordsetta muốn đánh dấu bookmark.
  2. Để gán giá trị thuộc tính bookmark của đối tượng Recordset cho một biến chuỗi. Nó sẽ lưu bookmarkduy nhất cho mẩu tin hiện hành.
  3. Khi ta muốn quay lại mẩu tin, đổi thuộc tính Bookmarkcủa recordsetlà giá trị của biến chuỗi. Mẩu tin hiện hành sẽ được đổi sang mẩu tin bookmark.
Không phải mọi kiểu đối tượng Recordset đều hỗ trợ thuộc tính Bookmark. Để xác định xem ta có thể đánh dấu bookmark trên một kiểu recordset hay không , kiểm tra giá trị của thuộc tính bookmarkable. Nếu thuộc tính này là True, ta có thể đánh dấu bookmark trên Recordset.

Sử dụng tập hợp Errors và đối tượng Error để xử lý lỗi

Ứng dụng có thể xử lý lỗi trong DAO bằng cách sử dụng đối tượng Error và tập hợp Errors. Bởi vì Errors có sẵn trong lập trình cơ sở dữ liệu, một hoạt động nào đó đều có thể phát sinh nhiều hơn một lỗi. (Điều này chính xác với lập trình Client / Server, trong đó, ví dụ như khi server bị treo, tầng trung gian bị ảnh hưởng theo và trình điều khiển ODBC sẽ bị thất bại). Cả 3 tầng này đều phát sinh thông báo lỗi của riêng chúng, nhưng ta sẽ không thấy các thông báo lỗi này trừ phi ta có một tập hợp để duyệt qua).

Tập hợp Errors, thay vì đối tượng Error duy nhất, cho phép ta duyệt qua tất cả lỗi để xác định nguyên nhân vấn đề.

Ví dụ sau đây trình bày cách lặp xuyên qua tập hợp Errorscủa DBEngine để xem các lỗi phát sinh.

Option Explicit
    ' References: MS DAO 3.51
    Dim db As Database
    Dim rs As Recordset
    Private Sub cmdBadFileName_Click() On Error GoTo ErrHandler
    Set db = OpenDatabase("....DBslez.mdb") Exit Sub
    ErrHandler:
    Dim DBError As Error
    Debug.Print "Contents of DBEngine Errors Collection" Debug.Print "--------------------------------------"
    For Each DBError In DBEngine.Errors Debug.Print DBError.Description Next
    End Sub
    

DAO cung cấp các thủ tục rất phong phú dùng để tạo cơ sở dữ liệu, bảng, trường, và các định nghĩa truy vấn. Ngoài ra, DAO còn cho phép ta tạo kiểu dữ liệu hiệu chỉnh mới trong ứng dụng, chẳng hạn như các thuộc tính hiệu chỉnh của các đối tượng cơ sở dữ liệu và những kiểu tài liệu cơ sở dữ liệu mới.

Tạo một CSDL

Ta có thể sử dụng phương thức CreateDatabasecủa đối tượng DBEnginetrong DAO để tạo cơ sở dữ liệu Jet của Microsoft.

Khi tạo một cơ sở dữ liệu, ta phải cung cấp tên một tập tin (thường có phần mở rộng là MDB) và một locale. Locale là một chức năng của ngôn ngữ được dùng bởi người sử dụng ứng dụng; nó chỉ ra thứ tự đối chiếu cho cơ sở dữ liệu. Thứ tự đối chiếu xác định cách thức lưu trữ các dữ liệu dạng văn bản trong cơ sở dữ liệu theo mặc định.

Phương thức CreateDatabase của đối tượng DBEngine thay thế dòng lệnh CreateDatabase thường dùng trong các phiên bản cũ của DAO. Nhưng bởi vì DBEngine là một trong những đối tượng DAO mà ta không cần tham chiếu tường minh trong chương trình, ta có thể tiếp tục sử dụng CreateDatabase như cách cũ, không có tham chiếu đến đối tượng DBEngine trước nó. Tuy nhiên, nếu muốn chính xác 100%, ta dùng DBEngine.CreateDatabase thay vì CreateDatabase.

Ví dụ sau tạo một cơ sở dữ liệu. Ngoài ra, nó còn nối thêm một bảng duy nhất với 2 trường vào cơ sở dữ liệu .

Option Explicit
    ' References MS DAO 3.51
    Private db As Database
    Private td As TableDef
Private f As Field
    Private Sub cmdCreate_Click() On Error GoTo ErrHandler
    Set db = DBEngine.CreateDatabase("....DB
ewdb.mdb", dbLangGeneral) Set td = New TableDef
    Set f = td.CreateField("LastName", dbText, 50)
    td.Fields.Append f
    Set f = td.CreateField("FirstName", dbText, 50)
    td.Fields.Append f td.Name = "tblSupplier" db.TableDefs.Append td Set db = Nothing
    MsgBox "The database newdb.mdb has been created." Exit Sub
    ErrHandler:
    If Err = 3204 Then
    MsgBox "Try deleting the database 'newdb.mdb' first, pal." Else
    MsgBox Err.Description
    End If
    End Sub
    

Bởi vì phương thức CreateDatabase phát ra một lỗi nếu cơ sở dữ liệu đã có sẵn, chương trình này chứa phần xử lý lỗi thông báo cho người sử dụng những gì cầm làm khi cơ sở dữ liệu đã có sẵn. Cũng lưu ý rằng ta không cần tạo một đối tượng DBEngine. Nó luôn có sẵn để sử dụng bởi ứng dụng.

Sử dụng đối tượng TableDef để thao tác với bảng

Ta sử dụng đối tượng TableDef để thao tác với cấu trúc của các bảng trong ứng dụng. Ta có thể dùng đối tượng TableDef để tạo bảng mới hoặc thay đổi bảng hiện hành.

Sử dụng đối tượng TableDef để tạo một bảng mới

Để tạo một bảng mới, ta tạo một đối tượng kiểu TableDef và sau đó nối nó vào tập hợp TableDefs bằng cách sử dụng phương thức Append của tập hợp. (Cách làm này tương tự cho nhiều kiểu đối tượng DAO khác dùng để tạo các thành phần cố định của một cơ sở dữ liệu ).

Ví dụ sau đây dùng TableDef để tạo một bảng mới. Đoạn chương trình này sử dụng đối tượng Field và tập hợp Fields; sẽ được trình bày trong phần sau. Lưu ý rằng nếu ta dùng đoạn chương trình này để tạo một bảng có sẵn, ta sẽ bị báo lỗi thi hành. Do đó, nếu ta có sẵn một bảng là tblEmployee, ta chỉ ra giá trị cho thuộc tính Name của đối tượng TableDef tblEmployeeNew.

Option Explicit
    ' References: Microsoft DAO 3.51 Object Library
    Dim db As Database
    Private Sub Form_Load()
    Set db = OpenDatabase("....db
ovelty.mdb") End Sub
    Private Sub cmdCreate_Click() On Error GoTo ErrHandler
    Dim td As TableDef
    Dim f As Field
    Set td = New TableDef Set f = New Field f.Name = "FirstName" f.Type = dbText
    td.Name = "tblEmployeeNew" td.Fields.Append f db.TableDefs.Append td
    MsgBox "Lo, the table has been created." Exit Sub
    ErrHandler:
    If Err.Number = 3010 Then
    MsgBox "You can't create the table twice, chief." Else
    MsgBox Err.Description
    End If
    End Sub
    

Ta có thể tạo bảng và trường theo cách chính quy. Ta có Microsoft Access và VisualData Manager của Visual Basic để làm việc này.

Ngoài ra, Để tạo bảng và các trường trong bảng cũng như mối quan hệ của bảng bằng chương trình ta dùng thêm phương thức CreateField của TableDef để tạo đối tượng Field và sử dụng phương thức CreateRelationcủa đối tượng Database. Để tạo chỉ mục sử dụng phương thức CreateIndex của đối tượng TableDef.

Sử dụng đối tượng QuyryDef để thao tác trên truy vấn chứa sẵn

Ta có thể sử dụng đối tượng QueryDef của DAO để tạo và sửa đổi các truy vấn chứa sẵn. Ngoài việc tạo các truy vấn chứa sẵn, đối tượng QueryDef còn cho phép thi hành các truy vấn tham số hoá; đây là một láy do phổ biến để truy cập các đối tượng QueryDef thông qua lập trình DAO.

Ta còn có cách khác để tạo các truy vấn chứa sẵn thông qua DAO. Đó là sử dụng Microsoft Access hay VisualdDataManager của Visual Basic để tạo các truy vấn chứa sẵn.

Ta tạo định nghĩa truy vấn trong cơ sở dữ liệu bằng cách sử dụng đối tượng QueryDef của DAO. Các định nghĩa này có thể là tạm thời, nghĩa là chúng sẽ biến mất khi hoàn tất hoặc là vĩnh viễn chứa trong cơ sở dữ liệu.

Ta tạo một đối tượng QueryDef bằng đoạn chương trình sau:

Option Explicit
    ' References MS DAO 3.51
    Dim db As Database Dim qd As QueryDef Sub Form_Load()
    Set db = OpenDatabase("....DB
ovelty.mdb") End Sub
    Private Sub cmdCreate_Click() On Error GoTo ErrHandler
    Set qd = New QueryDef
    qd.SQL = "SELECT * FROM tblCustomer " & _ "WHERE LastName Like 'L*' " & _ "ORDER BY [LastName], [FirstName]"
    qd.Name = "qryCustomerSortName"
    db.QueryDefs.Append qd
    MsgBox "Whaddya know, the query was created." Exit Sub
    ErrHandler:
    MsgBox "There was an error creating the querydef. (" & _ Err.Description & ")"
    End Sub
    

Ta chỉ ra tên của QueryDef cần tạo bằng cách sử dụng thuộc tính Name của đối tượng

QueryDef. Nếu ta cố tạo một QueryDef có sẵn, nó sẽ kích hoạt một lỗi bẫy được.

Đừng quên đặt tên cho QueryDef mới; nếu không, ta sẽ không có cách nào tham chiếu đến nó ( và Jet không thể lưu nó). Nhớ rằng, ta cần xác định truy vấn nào có sẵn trong cơ sở dữ liệu tại thời điểm bất kỳ bằng cách lặp qua tập hợp QueryDefs.

Sử dụng đối tượng QueryDef để thi hành truy vấn

Ta có thể thi hành truy vấn bằng cách sử dụng các phương thức của đối tượng QueryDef . Ta thường thực hiện điều này trong những trường hợp mà ta cần làm một công việc bất thường nào đó trước khi thi hành truy vấn, như là chỉ định một tham số, hoặc khi ta cần thi hành một truy vấn hành động dùng để cập nhật, xoá hay sửa đổi các mẩu tin trong cơ sở dữ liệu.

Để thi hành một QueryDef, ta sử dụng phương thức OpenRecordsetcủa đối tượng QueryDef (để thi hành một truy vấn hành động ). Để thi hành một QueryDef, ta theo các bước sau:

  1. Tạo một instance của đối tượng QueryDef bằng lập trình
  2. Tạo một chuỗi SQL định nghĩa những gì QueryDef sẽ làm khi nó thi hành.
  3. Gán chuỗi SQL cho thuộc tính SQL của QueryDef.
  4. Nối QueryDef vào tập hợp QueryDefs của đối tượng Database. Ví dụ :
Private Sub cmdRun_Click() On Error GoTo ErrHandler Dim rs As Recordset
    Dim qd As QueryDef
    Set qd = db.QueryDefs("qryCustomerSortName") Set rs = qd.OpenRecordset
    Do Until rs.EOF
    lstCustomer.AddItem rs!LastName & " " & _ rs!FirstName & " " & _ rs!Address
    rs.MoveNext
    Loop
    Exit Sub
    ErrHandler:
    MsgBox "There was an error running the query. " & _ "Are you sure you created it?"
    End Sub
    

Sử dụng đối tượng QueryDef để tạo truy vấn

Ta có thể tạo một QueryDef bằng cách lập trình. Để tạo một QueryDef, ta tạo một đối tượng QueryDef mới bằng cách sử dụng phương thức CreateQueryDef của đối tượng Database. Phương thức này cho phép cung cấp một tên cho truy vấn và gán cho nó một chuỗi SQL. Thi hành phương thức này cũng lưu QueryDef vĩnh viễn trong cơ sở dữ liệu.

Dim db As Database
    Dim qd As QueryDef
    Set db = OpenDatabase("....DB
ovelty.mdb")
    Set qd = db.CreateQueryDef("qryCustomer" , "Select * from tblCustomer")
    

Mỗi lần tạo QueryDef, ta có thể thao tác với nó trong chương trình như ta vẫn thường làm. Cho QueryDef một tên là để xác định xem truy vấn có được chứa vĩnh viễn trong cơ sở dữ liệu hay không. Nếu ta muốn tạo một QueryDef mà không chứa vĩnh viễn trong cơ sở dữ liệu, chỉ cần truyền một chuỗi rỗng thay cho tham số thứ nhất của phương thức CreateQueryDef.

Sử dụng đối tượng Parameter để tạo truy vấn tham số hoá

Tập hợp Parameters của một QueryDef cho phép ta tiến hành một truy vấn tham số hoá. Các truy vấn này được xây dựng với một hay nhiều thành phần cố ý bỏ qua; các thành phần này được phải cung cấp đủ khi truy vấn thi hành.

Ta tạo các truy vấn tham số hoá bởi vì chúng thi hành nhanh hơn các truy vấn xây dựng trong SQL chứa trong chương trình Visual Basic. Điều này xảy ra vì bộ máy cơ sở dữ liệu biên dịch một truy vấn trước khi ta thi hành, giúp tối ưu hoá thi hành của truy vấn.

Chương 12 trình bày cú pháp của một truy vấn tham số hoá

SELECT * FROM tblCustomer WHERE ID=pID
    

Tham số trong truy vấn này là pID. Dưới cú pháp SQL của Jet, pID được thông dịch thành một tham số bởi vì nó không hưởng ứng tên của trường hoặc bảng bất kỳ trong cơ sở dữ liệu.

Để truy vấn thi , ta cung cấp một giá trị cho tham số này. Ta cung cấp một tham số trong chương trình bằng cách chỉ ra thuộc tính Value của đối tượng Parameter thích hợp.

Option Explicit
    ' References MS DAO 3.51
    Private db As Database Private qd As QueryDef Private rs As Recordset Private Sub Form_Load()
    Set db = OpenDatabase("....DB
ovelty.mdb") Set qd = db.QueryDefs("qryCustomerByID") End Sub
    Private Sub cmdQuery_Click() qd.Parameters("pID").Value = txtID.Text Set rs = qd.OpenRecordset
    If rs.EOF And rs.BOF Then
    MsgBox "Sorry, no customers with that " & _
    "ID are in the database."
    Else
MsgBox rs!Address & vbCrLf & _
    rs!Phone, _
    vbInformation, _
    "Info for " & rs!FirstName & _ " " & rs!LastName
    End If
    End Sub
    

Để tìm ra một khách hàng với ứng dụng này, người sử dụng nhập số ID của khách hàng trong hộp văn bản. Nếu ứng dụng tìm thấy một khách hàng với ID đó trong cơ sở dữ liệu, nó sẽ hiển thị địa chỉ và số điện thoại cảu khách hàng đó. Nếu ứng dụng xác định rằng không có mẩu tin đáp ứng tiêu chí tìm kiếm, nó sẽ thông báo cho người sử dụng.

Bởi vì tham số của một QueryDef là một hàm của câu lệnh SQL định nghĩa truy vấn, ta không thể tham số mới vào tập hợp Parameters của một QueryDef như cách ta thường làm để thêm một đối tượng vào tập hợp trong DAO.

Tài liệu cơ sở dữ liệu là một cấu trúc DAO cho phép ta tham chiếu đến các phần tử của cơ sở dữ liệu một cách tổng quát. Chúng còn cung cấp khả năng mở rộng các tính năng của cơ sở dữ liệu Jet. Ta truy cập các thuộc tính của một tài liệu cơ sở dữ liệu thông qua đối tượng Container.

Đối tượng Container sở hữu bộ các đối tượng Document.

Tương tự như nhiều đối tượng khác có sẵn trong DAO, ta có thể dùng lập trình DAO để lặp xuyên qua nơi chứa và tài liệu. Ví dụ sau đây trình bày cách lặp xuyên qua các đối tượng Collection Documenttrong một cơ sở dữ liệu Jet.

Option Explicit
    ' References DAO 3.51
    Private db As Database Private con As Container Private doc As Document Private Sub Form_Load()
    Set db = OpenDatabase("....DB
ovelty.mdb") End Sub
    Private Sub cmdView_Click()
    lstOutput.Clear
    For Each con In db.Containers lstOutput.AddItem con.Name
    For Each doc In con.Documents lstOutput.AddItem "" & doc.Name Next
    Next
    End Sub
    

Cần phải hiểu điểm khác biệt giữa tài liệu cơ sở dữ liệu và tập hợp DAO. Ví dụ, một tập hợp của TableDeftham chiếu đến tất cả các TableDef ta mở ra trong chương trình. Trái lại, tài liệu Tableschứa các tham chiếu đến tất cả các tài liệu bảng trong cơ sở dữ liệu mà ta mở. Trong Jet, nơi chứa Tables bao gồm các tài liệu như là truy vấn chứa sẵn và các bảng hệ thống (bắt đầu bằng “MSys”).

Ta sử dụng các đối tượng Container Documenttrong những trường hợp sau:

  • Ta muốn gán việc cho phép bảo mật cho một đối tượng trong một cơ sở dữ liệu bảo mật .
  • Ta muốn tạo hoặc lấy về các thuộc tính hiệu chỉnh cho tất cả các thành phần của một cơ sở dữ liệu bằng cách lặp xuyên qua các tập hợp

Ngoài việc kiểm tra nội dung của các tại liệu cơ sở dữ liệu hiện hành, DAO còn cho phép ta định nghĩa và tự tạo các tài liệu, chúng có thể chứa trong cơ sở dữ liệu cùng với tài liệu mặc định.

Các tài liệu hiệu chỉnh bao hàm trong mô hình đối tượng Jet để hỗ trợ các mở rộng. Ý tưởng chung là để ngăn ngừa mô hình đối tượng hiện hành cấm các tính năng mới.

Ta có thể tham chiếu đến các thuộc tính của DAO một cách tổng quát. Điều này cho phép khả năng mở rộng, cho phép ta thêm các thuộc tính riêng và đọc thuộc tính của các đối tượng hiện hành dù cho ta có biết những gì chúng được gọi hay không.

Ta truy cập đến danh sách tổng quát các thuộc tính của DAO thông qua tập hợp Propertiesvà đối tượng Property.Ta có thể tạo một thuộc tính mới bằng cách sử dụng phương thức CreatePropertycủa đối tượng Document.Các thuộc tính được cung cấp bởi tập hợp Propertiesđược gọi là thuộc tính động bởi vì chúng có thể khác nhau giữa một cơ sở dữ liệu này và một cơ sở dữ liệu khác hay giữa các phiên bản khác nhau của bộ máy cơ sở dữ liệu.

Ví dụ sau đây trình bày cách thức tập hợp Propertieshoạt động. Đây là thủ tục phát sinh danh sách các thuộc tính mặc định hiện có trong một cơ sở dữ liệu.

Option Explicit
    ' References: Microsoft DAO 3.51
    Dim db As Database
    Dim pr As Property
    Private Sub Form_Load()
    Set db = OpenDatabase("....DB
ovelty.mdb") End Sub
    Private Sub cmdShow_Click() On Error Resume Next lstOutput.Clear
    For Each pr In db.Properties
    With pr
    lstOutput.AddItem .Name & _ ": " & .Value
    End With
    Next
    End Sub
    

Có 13 thuộc tính mặc định của một đối tượng Database hiện có thông qua tập hợp Properties, bao gồm những phần cố định như là Name, Version, Connect,cũng như các thuộc tính không thể truy cập trực tiếp, như là AccessVersion Build.

Vì vậy, ta có thể viết chương trình như sau:

MsgBox db.Name

Vậy, tại sao ta không viết chương trình để truy cập một thuộc tính của cơ sở dữ liệu :

MsgBox db.Properties (“Name”)

Câu trả lời là ta có thể tựtạo các thuộc tính hiệu chỉnh và gán chúng đến bất kfy DAO nào ( không chỉ đến đối tượng Database), Ví dụ sau tạo một thuộc tính mới trong cơ sở dữ liệu.

Private Sub cmdCreate_Click() On Error Resume Next
    Dim prp As Property
    Set prp = db.CreateProperty("DateLastBackedUp", dbDate, Now)
    db.Properties.Append prp
    cmdShow_Click ' update list of properties
    End Sub
    

Sau đây là cú pháp đầy đủ của phương thức CreateProperty:

obj.CreateProperty ([propertyName], [datatype] , [value], [ddl] )
  • Tham biến PropertyName là một chuỗi chỉ ra tên của một thuộc tính mới
  • Tham biến DataType chỉ ra kiểu dữ liệu của thuộc tính mới.
  • Tham biến Value cung cấp một giá trị khởi tạo cho thuộc tính.
  • Tham biến ddl là một giá trị boolean ch
0