Sau khi đã tạo được liên kết xong chúng ta mới có thể thực hiện các thao tác xử lý dữ liệu trênCSDL này... • Password: Chuỗi mật khẩu tương ứng với User name nhằmthâm nhập CSDL Command Đ
Trang 1www.vovisoft.com hay những trang khác Tôi xin nói ngắn
gọn: ADO là viết tắt của chữ ActiveX Data Object Đây
là một đối tượng giúp bạn làm việc với nhiều kiểu dữ liệu khác nhau
Giống như ODBC (Open DataBase Connectivity), kỹ
thuật lập trình với OLE DB đòi hỏi phải được thực hiện bằng các lệnh phức tạp cấp thấp API Chính vì lý do này, Microsoftcũng đã đưa ra một lớp giao tiếp lập trình cấp cao ADO đượcxây dựng dựa trên kỹ thuật OLE DB cho phép lập trình
nhanh các ứng dụng liên kết CSDL (Cơ sở dữ liệu)
CÁC ĐỐI TƯỢNG LẬP TRÌNH ADO CƠ SƠ
Lớp giao tiếp lập trình dữ liệu cấp cao ADO cung cấp một tậphợp những đối tượng giúp chúng ta dễ dàng làm việc với cácnguồn dữ liệu khác nhau Trong các đối tượng này có những
đối tượng chính cần tìm hiểu, đó là: Connection,
Recordset, Command, Field (ngoài ra còn có:
Parameter, Property, Error).
Connection
Đây là một đối tượng được sử dụng để tạo liên kết giữa
chương trình với CSDL Sau khi đã tạo được liên kết xong chúng ta mới có thể thực hiện các thao tác xử lý dữ liệu trênCSDL này
Trang 2Để tạo lập một liên kết Connection chúng ta cần xác định rõ các thông tin cần thiết bao gồm:
• Provider: Tên của chương trình giao tiếp dữ liệu (OLE DB Provider)
• Data source: Tên đầy đủ của tập tin CSDL hay tên nguồn
dữ liệu ODBC cần liên kết
• Username: Đây là một thông tin tùy chọn quy định tên củangười dùng được tổ chức bên trong CSDL này Nó phụ thuộc vào các lọai CSDL, với các CSDL Access chúng ta có thể bỏ qua thông tin này
• Password: Chuỗi mật khẩu tương ứng với User name nhằmthâm nhập CSDL
Command
Đối tượng Command sẽ cho phép chương trình có thể gọi thực hiện một câu lệnh truy vấn SQL trên CSDL hay gọi thựchiện một thủ tục xử lý đã được cài đặt trong CSDL (Stored procedure)
Nếu các thủ tục xử lý trong CSDL này có nhận và trả về giá
trị, thì khi đó chúng ta sẽ dùng đối tượng Parameter
Với CSDL Access, các truy vấn đã được xây dựng sẵn trong tập tin MDB (bao gồm các truy vấn chọn, thêm, xóa, sửa, )
có thể được xem như là các stored procedure
Recordset
Là đối tượng lưu trữ một tập họp các mẫu tin được chọn từ các bảng có trong CSDL Thông qua các đối tượng
Recordset, chúng ta có thể thực hiện các xử lý như hiển thị
dữ liệu, cập nhật, tìm kiếm, với CSDL đã nối kết Thông thường các Command có câu lệnh truy vấn thực hiện dạng
Trang 3SELECT đều trả về một bộ mẫu tin (Recordset).
Trong quá trình lập trình CSDL với Visual Basic 6.0 chúng ta
có thể tạo ra Recordset bằng nhiều cách tại những thời điểmkhác nhau như: dùng ADO control, DataEnvirement hay dùng bằng lệnh
Đối tượng Field
Là đối tượng con cho phép chúng ta truy xuất và làm việc với một trường (cột) dữ liệu có trong một bộ mẫu tin
Recordset Với đối tượng field có hai thuộc tính cần quan tâm, đó là: Name (tên trường dữ liệu) và Type (kiểu dữ liệu của trường)
Bây giờ chúng ta sẽ đi vào từng thuộc tính và phương thức chính của các đối tượng trên
Trang 4Trước khi thực hiện tạo một liên kết dữ liệu, chúng ta cần khai báo các tham số cần thiết cho đối tượng Connection như tên server, tên cơ sở dữ liệu, tên người dùng và mật khẩu Sau đây là các thuộc tính quan trọng cần khai báo khi tạo một liên kết dữ liệu.
_Thuộc tính ConnectionString: là chuỗi ký tự chứa các thôngtin cần thiết cho việc nối kết dữ liệu Chuỗi ký tự này gồm các thành phần thông tin như:
_Provider: tên trình liên kết dữ liệu OLE DB
_Server: tên máy chủ chứa CSDL cần kết nối
_Use ID: mã số người dùng
_Password: mật khẩu người dùng
_Data Source: nguồn dữ liệu kết nối
Ví dụ khi kết nối với một cơ sở dữ liệu SQL Server có tên QLTV chúng ta sẽ có chỗi sConnection như sau:
sConnection="Provider=SQLOLEDB;" & "Server=ServerNT; User ID=MyID; " & "Password=MyPWD; Data Source=QLTV"
Một số connection string tham khảo từ trang web Erlandsen Data Consulting:
Kết nối vào Access database dùng standard security:
cn.Open "driver={Microsoft Access Driver (*.mdb)};"
& _
"dbq=c:\foldername\
databasename.mdb;uid=admin;pwd="
Trang 5Kết nối vào một Access database dùng một workgroup
Kết nối vào một Access database exclusively:
cn.Open "driver={Microsoft Access Driver (*.mdb)};"
& _
"dbq=c:\foldername\databasename.mdb;" & _
"exclusive=1;uid=admin;pwd="
Kết nối vào một SQL server dùng standard sequrity:
cn.Open "driver={SQL Server};" & _
"server=servername;database=databasename;" & _ "uid=userid;pwd=userpassword"
Kết nối vào SQL server dùng trusted connection security:cn.Open "driver={SQL Server};" & _
"server=servername;database=databasename;" & _ "uid=;pwd="
Kết nối vào một SQL server từ name và password:
Trang 6Connecting to an Oracle database using the current
Microsoft ODBC driver:
cn.Open "driver={Microsoft ODBC for Oracle};" & _ "server=servername.world;" & _
Trang 7Bạn phải định nghĩa dbq databasename trong file
tnsnames.ora
Kết nối vào một Excel workbook:
cn.Open "driver={Microsoft Excel Driver (*.xls)};"
& _
"driverid=790;dbq=c:\foldername\
workbookname.xls;" & _
"defaultdir=c:\foldername"
Kết nối vào một dBase database:
cn.Open "driver={Microsoft dBase Driver (*.dbf)};"
Kết nối vào một Paradox database:
cn.Open "driver={Microsoft Paradox Driver
(*.db )};" & _
"driverid=538;fil=Paradox 5.X;" & _
"defaultdir=c:\foldername\;" & _
"dbq=c:\foldername\;collatingsequence=ASCII"
Trang 8The extra space character after *.db in the driver name is necessary.
Bạn phải cần Borland Database Engine (BDE) để cập nhật file ISAM
Kết nối vào một file text:
cn.Open "driver={Microsoft Text Driver (*.txt;
*.csv)};" & _
"dbq=c:\foldername\;" & _
"extensions=asc,csv,tab,txt,log,*."
rs.Open "select * from filename.csv", cn,
adOpenStatic, adLockReadOnly, adCmdText
Định dạng của file text được định nghĩa bởi file schema File thông tin schema luôn luôn được đặt tên là Schema.ini và luôn luôn được đặt trong cùng thư mục với file nguồn File này cung cấp thông tin về định dạng tổng quát của file, tên cột và kiểu dữ liệu File Schema.ini luôn luôn được yêu cầu
để lấy dữ liệu từ fixed-width data
Trang 9Ví dụ file Schema.ini cho filefilename.txt chứa dấu ";" phân cách giữa các trường dữ liệu, và hàng đầu tiên chứa các tên của các cột dữ liệu:
Col1=FieldName1 Char Width 30
Col2=FieldName2 Date Width 15
Col3=FieldName3 Integer Width 15
Col4=FieldName4 Float Width 20
CharacterSet=ANSI
_Thuộc tính CursorLocation: đây là thuộc tính quy định con trỏ liên kết dữ liệu sẽ được tạo tại máy chủ hay máy con Các hằng số dùng cho thuộc tính này gồm:
• adUseServer: con trỏ liên kết dữ liệu được tạo ra tại máy
Trang 10chủ Mọi sửa đổi của các người dùng khác trên mạng được thể hiện tức thời trên dữ liệu của máy trạm.
• adUseClient: con trỏ liên kết dữ liệu được tạo tại máy
trạm Mọi sửa đổi của người dùng khác trên mạng không được thể hiện trên dữ liệu của máy trạm cho đến khi được truy xuất lại Với kiểu con trỏ này, dữ liệu trên máy trạm có những thuận lợi mà kiểu adUseServer không có
Thuộc tính này chung cho Connection lẫn Recordset, nghĩa làtất cả các Recordset tạo ra từ một Connection sẽ có cùng kiểu con trỏ nếu không được qui định tường minh
2.Tạo đối tượng Connection dùng lệnh
Tại thời điểmứng dụng đang thực thi (runtime), chúng ta có thể tạo
Connection với các bước sau:
2.1 Bước1: Khai báo tham chiếu đến thư viện ADO
Để sử dụng kỹ thuật ADO, ta phải khai báo tham chiếu đến thư viện ADO trong ứng dụng như sau:
Trang 11• Chọn Project | References
• Chọn Microsoft ActiveX Data Objects X.X Library, với X.X làphiên bản có trên máy trạm tùy theo hệ thống, sau đó chọn OK
2.2 Bước 2: Khai báo và khởi tạo một đối tượng Connection
Trước tiên, ta khai báo một biến đối tượng kiểu Connection của ADO như sau:
Dim cnn as New ADODB.Connection
Trong trường hợp ứng dụng có tham chiếu đến nhiều thư viện lập trình ADO, RDO (Remote Data Object), nếu chúng
ta khai báo một biến Connection nhưng không chỉ cụ thể Connection thuộc thư viện nào thì đối tượng Connection được tạo ra sẽ thuộc thư viện tham chiếu ưu tiên Thư viện tham chiếu ưu tiên là thư viện được liên kết trước các thư viện khác trong danh sách của bảng References
2.3 Bước 3: Khai báo thuộc tính liên kết dữ liệu
Gán thuộc tính ConnectionString cho đối tượng Connection cnn theo cú pháp sau:
cnn.ConnectionString ="Provider= "
cnn.CursorLocation = adUseClient hay adUseServer
Các chuổi ConnectionString xin tham khảo phần trên đã giới thiệu
2.4 Bước 4: Kết nối
Trang 12Dùng phương thức Open của Connection để thực hiện kết nối Cú pháp sử dụng có dạng:
Sau khi kết nối, chúng ta dùng thuộc tính State để kiểm tra kết nối có thành công hay không
Hằng |Trị |Ý nghĩa adStateClosed |0 |Không kết nối adStateOpen |1 |Đang kết nối Ví dụ như đọan mã sau:
Trang 13End If
4 Phương thức Excecute
Sau khi kết nối thành công, ta có thể dùng phương thức Execute của connection để thực hiện truy vấn hay cập nhật
dữ liệu Cú pháp như sau:
Set <biến Recordset> = <biến Connection>.Execute (<Nội dung truy vấn>[<biến chứa số mẫu tin>][,<hằngkiểu nội dung truy vấn>])
cho truy xuất Hoặc
<biến Connection>.Execute (<Nội dung truy
vấn>[,<biến chứa số mẫu tin>][,<hằng kiểu nội dung truy vấn>])
cho cập nhật
Nếu <nội dung truy vấn> kiểu chuỗi là: Thì <hằng kiểu nội dung truy vấn> kiểu số Có trị là Tên bảng adCmdTable 2 Câu truy vấn Select adCmdText 1 Tên Query trên
Access hoặc Stored Procedure trong SQL Server
• Recordset được tạo ra theo cách này có thuộc tính chỉ đọc (ReadOnly)
Trang 14Ví dụ:
<BR><br>
Dim rstdmnv as New ADOB.Recordset
Set rstdmnv=cnn.Execute ("dmnv", , adCmdTable)
5 Đóng liên kết dữ liệu
Một liên kết dữ liệu (Connection) sẽ tự động được đóng khi đóng ứng dụng Tuy nhiên trong chương trình khi cần đóng liên kết dữ liệu lại, chúng ta có thể dùng phương thức Close theo cú pháp sau:
cnn.Close
COMMAND
Sau khi thực hiện kết nối với nguồn dữ liệu qua Connection, chúng ta có thể dùng Command để thực hiện một lệnh truy vấn SQL trên nguồn dữ liệu đó hay gọi thực hiện một thủ tụcnội trong cơ sở dữ liệu này Command đặc biệt hữu dụng khiphải thực hiện nhiều lần cùng một lệnh hay các truy vấn có tham số Khởi tạo và làm việc với Command
Các thuộc tính chính
• CommandText: đây là thuộc tính quan trọng nhất của
Command Nội dung của thuộc tính này là chuỗi lệnh SQL, tên truy vấn, tên bảng hoặc tên thủ tục nội muốn thực hiện trên nguồn dữ liệu
• CommandType: là thuộc tính giúp ADO nhanh chóng xác
định kiểu lệnh có trong CommandText Nếu trị của
CommandType dùng không đúng kiểu của CommandText thìchương trình sẽ báo lỗi Chính vì vậy, chúng ta cần phải biết
Trang 15và sử dụng các hằng thường dùng cho CommandType sau:
- adCmdText: nếu CommandText là câu truy vấn SQL
- adCmdTable: nếu CommandText là tên bảng của cơ sở dữ
liệu
- adCmdStoreProc: nếu CommandText là tên thủ tục nội
- adCmdUnknown: khi không biết kiểu của CommandText
Đây là trị mặc định, trong trường hợp này, trình cung cấp OLEDB sẽ xác định kiểu Tuy nhiên đây là điều không nên vàlàm tốn thời gian
- adCmdExecutteNoRecords: nếu CommandText là lệnh
hay thủ tục nội không trả về các mẫu tin (như khi cập nhật, xóa, ) và được dùng chung với adCmdStoreProc
- adCmdTabldirect: nếu mở trực tiếp bảng của cơ sở dữ
liệu
• ActiveConnection: thuộc tính này xác định liên kết dữ
liệu (Connection) mà Command sẽ thực hiện trên đó Vì thế,nếu bỏ trống thuộc tính này sẽ gây ra lỗi khi thực hiện lệnh
Chúng ta có thể dùng chuỗi ConnectionString của
Connection hoặc bản thân Connection đang kết nối để gán trị cho thuộc tính này Thông thường, khi cần làm việc với nhiều Command, chúng ta nên gán chính đối tượng
Connection cho thuộc tính ActiveConnection của các
Command vì nếu dùng ConnectionString để gán sẽ tạo ra nhiều liên kết riêng biệt
Làm việc với Command
Để làm việc với đối tượng Command, chúng ta sẽ thực hiện các bước sau:
Trang 16Bước 1: Khai báo và cấp phát vùng nhớ biến Command
Có hai cách khai báo Command:
- Khai báo và cấp phát vùng nhớ cùng lúc
Dim cmd As New ADODB.Command
- Khai báo trước, khi dùng sẽ cấp phát vùng nhớ sau
Dim cmd As ADODB.Command
Set cmd=New ADODB.Command
Bước 2: Đặt các thuộc tính cần thiết
Các thuộc tính cần thiết cho đối tượng Command gồm:
• Thuộc tính CommandText
• Thuộc tính CommandType
• Thuộc tính ActiveConnection
Bước 3: Gọi thực hiện Command
Để gọi thực hiện một Command, chúng ta dùng phương thứcExecute theo cú pháp đơn giản như sau: • Đối với Commanddạng rút trích (Tức là Select ):
Set <recordset>=<command>.Execute()
• Đối với Command cập nhật (Insert, Delete, Update, )
<command>.Execute()
Trang 17Với <recordset> là biến kiểu Recordset của ADO,
<command> là biến đối tượng command muốn thực hiện
Ví dụ: Đọan chương trình sau sẽ minh họa việc khởi tạo và gọi thực hiện Command trong Visual Basic (cũng như trong VBA)
Giả sử tập tin quản lý nhân sự nhansu.mdb được lưu trữ
dưới đây:
Const DBPATH="C:\QLNS\Nhansu.mdb"
'Tạo đối tượng command thứ nhất
Dim cmd1 As New ADODB.Command
Dim rst1 As New ADODB.Recordset
cmd1.ActiveConnection="Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & DBPATH
cmd.CommandText="SELECT mato, tento" & "FROM dmto" Set rst1=cmd.Execute()
'Tức là chọn mã tổ, tên tổ từ bảng dmto (danh mục tổ)
'Tạo đối tượng command thứ hai
Dim cmd2 As New ADODB.Command
Dim rst2 As New ADODB.Recordset
Set cmd2.ActiveConnection=cmd.ActiveConnection
cmd2.CommandText="SELECT * FROM dmnv"
Set rst2=cmd2.Execute()
Trang 18Command có tham số
Muốn thực hiện nhiều lần một Command với các điều kiện khác nhau, ta có thể sử dụng Command có tham số Phần nội dung tiếp theo đây sẽ giới thiệu với các bạn cách tạo và gọi thực hiện Command có tham số tùy theo lọai của đối tượng Command
1 Với CommandText là chuỗi lệnh SQL
Trong trường hợp nội dung của CommandText là chuỗi lệnh SQL, chúng ta có thể dùng dấu ? thay cho các giá trị cụ thể trong phần điều kiện của câu lệnh SQL
Ví dụ để lấy danh sách nhân viên thuộc các tổ khác nhau, chúng ta có thể dùng:
cmd.CommandText="Select tento From " & "dmto Where mato=?"
Trong ví dụ trên chúng ta thấy ký tự ? đã được thay thế một giá trị cụ thể trong biểu thức điều kiện Để gọi thực hiện Command có tham số này, chúng ta sẽ sử dụng cú pháp đầy
đủ của phương thức Excecute như sau:
<command> Excute(Affected, Parameters, Options)
Cả ba tham số trong phương thức Execute đều là tham số tùy chọn Ý nghĩa của ba tham số này như sau:
• Affected: là một biến kiểu Long để nhận về số mẫu tin bị
ảnh hưởng của Command Với các Command rút trích, biến này không nói lên điều gì nhưng với những Command cập nhật chúng ta có thể biết được số mẫu tin được thay đổi hay xóa bởi Command
• Parameters: các giá trị sẽ truyền cho tham số của
Trang 19Command nếu có Trường hợp Command có nhiều hơn một tham số thì các giá trị được truyền cho tham số của
Command sẽ được lưu trong một biến mảng kiểu Variant
Như vậy để gọi thực hiện command trên với Mato cần lọc là chuỗi strMato chúng ta sẽ dùng cú pháp như sau:
Set rst=cmd.Execute(, strmato)
2 Với CommandText là tên thủ tục nội
Trong trường hợp cần gọi thực hiện một thủ tục nội trong cơ
sở dữ liệu, chúng ta cũng tiến hành tương tự chỉ có khác là thuộc tính CommandText sẽ chứa tên thủ tục và
CommandType là adCmdStoreProc Đọan lệnh dưới đây sẽ gọi thực hiện một truy vấn rút trích có tên Q_para để lấy về danh sách các nhân viên có tuổi từ 20 đến 25 (Q_para có chức năng rút trích thông tin các nhân viên có độ tuổi từ t1 đến t2 với t1, t2 là hai tham số của truy vấn)
cmd.CommandText = "Q_para"
cmd.CommandType = adCmdStoreProc
Set rst = cmd.Execute(,Array(20,25))
Chú ý: Cũng như Recordset được tạo từ phương thức
Execute của Connection, Recordset được tạo ra theo cách này có thuộc tính chỉ đọc
RECORDSET - BỘ MẪU TIN
Recordset còn được gọi là bộ mẫu tin Đây là đối tượng
chính của mô hình ADo, đối tượng được dùng để hiển thị và cập nhật dữ liệu trong lập trình ứng dụng CSDL