CÁC HẰNG SỐ COMMANDTYPE
Chương 2: Chương 2: CÁC MÔ HÌNH TRUY CAP DU LEU
Long Interger va cét thứ ba có kiểu là Text. (Khi bạn thêm các record vào một bảng, bạn phải để ý đến các kiểu đữ liệu của field).
Field Properties
General | Locke |
Fred Sce Loy treeger
Forrnst
Cocenal Aaces AAO
Tngat Mask A heekd mare can be up
Caption to 64 characters tard,
Defauk Yale 2 irchsdng spaces.
Vabdaton Rude ress F3 for hep on
Vokdation Text jack names,
Reqared No
Indexed Yes (No Dughc ates)
Hình 2-7. Khung nhìn Design của bảng để thủ tục InserRecords thêm cdc record.
Các phan ti téng quat cla thi tuc InserRecords được chia xẻ với các trình ứng dụng khác của đối tượng Conunand. Bạn tạo một tham chiếu đến đối tượng Commnand và thiết lập thuộc tính nối kết cho nó. Với mỗi hàng bạn cần thêm vào một record, ba dòng được yêu cầu là: cài đặt thuộc tính ConmunandText, cho biết lệnh gì sẽ lam; cài đặt thuộc tính CommandType, định rõ đạng lệnh; và phương pháp Excufe, bắt đầu thêm vào record mới. Bạn có thể lặp lại ba dòng này cho mỗi hàng được thêm vào nguồn dữ liệu. Nếu bạn chỉ định một tập hợp động (dynaset) có khả năng cập nhật, được (updatable) là đích đến, những bước này có thể thêm các
record đồng thời vào hai hoặc nhiều bảng tại cùng một thời điểm.
Cú pháp của câu lénh SQL CommandText cé ba điểm đặc trưng. (Cú pháp này không có giá trị từ SQL khung nhìn của người thiết kế query của Access). Đầu tiên, nó dùng từ khóa INSERT INTO, theo sau là tên của nguồn dữ liệu bạn muốn thêm các record
149
vào. Thứ hai, nó tạo bước tùy chọn việc liệt kê các tên field để đưa ra các giá trị Nếu bạn không thực hiện bước này, các giá trị của bạn trong bước thứ ba sẽ nối vào cuối theo thứ tự tuần tự, nó có thể bị trở ngại nếu việc thiết kế nguồn dữ liệu luôn luôn thay đổi. Thứ ba, từ khóa VALUUES xuất hiện trước khi các giá trị field cho record mới.
Cap nhột các giá trị của record
Các thủ tue OddToEven va EvenToOdd dưới đây cập nhật các giá trị nguồn dữ liệu của Column1 bing cách sử dụng đối tượng Command. Hinh 2-8 trình bày một khung nhìn khác của bảng ngay sau khi chạy các thủ tục DeleteAliRecords va InsertRecords. Chú ý rằng trong Hình 2-8 các giá tri cha ColumnI xen ké giita số lẻ và số chấn. Nếu giá trị trong Column1 là lẻ thì giá trị trong Column2 là chấn. Các thủ tục sử dụng thông tin này để quản lý nội dung của bảng.
FY 1L eee
IT Column1 Column2 Column3
| 23
|_| 4 56
| 7 89
= 10 11 12
= 13 14 15
| 1B 17 18
; Record: Wels} a! :
Hinh 2-8. Khung nhin Datasheet của bằng để cập nhật các thủ tục OddToEven và EvenToOdd.
Sub OddToEven( )
Dim cmd02E As ADODB.Command Dim intRowsChanged As Interger
Set cmd02E = New ADODB.Command 150
GY Chương 2: CÁC MÔ HÌNH TRUY CẬP DỮ LIỆU
With cmd02E
-ActiveConnection = CurrentProject.Connection
-CommandText = “UPDATE MyTable SET Columni = “& -
“Columni+1 WHERE ((-1*(Column1 Mod 2))=True)"
. CommandType = adCmdText `
-Execute intRowsChanged
Debug.Print intRowsChanged & “ rows were affected.”
End With ‘
End Sub
Sub EvenToOdd( }
Dim cmdE20 As ADODB.Command
Set cmdE20 = New ADODB.Command With cmdE20
-ActiveConnection = CurrentProject.Connection
-CommandText = “UPDATE MyTable SET Columni =“ & _
“Columnt-1 WHERE ((-1*(Column1 Mod 2))=False)"
. CommandType = adCmdText .Execute
End With End Sub
Ngày nay việc thiết kế toàn bộ các thủ tục này đã trở nên quen thuộc. Sự khác nhau quan trọng nhất giữa các ví dụ trong phiên bản này với các phiên bản trước đó là trong cú pháp của câu lénh SQL có thuéc tinh CommandText. Trong trường hợp nay, ban có thể dễ dàng thấy được cú pháp chung từ người thiết kế query trong Access. Ménh dé WHERE trong thủ tuc OddToEven chon cdc record có giá trị của Column 1a 1é. Phan Update cia cu pháp thêm 1 vào giá trị để thay đổi giá trị từ số lẻ thành số chấn. Phương pháp #xecute dùng một trong những đối số có sẵn để trả về số 151
hàng có lệnh thay đổi. Một phương pháp Prin£ đơn giản gửi giá trị này vào cửa số Immediate để xem.
Thủ tục EeenToOdd kiểm tra giá trị nhập vào Colunn2 để định rõ là nó phải trừ đi 1 từ giá trị trong Columnl. Khi giá trị nhập vào Coiumn2 không lẻ, câu lệnh SQL thao tác trên giá trị trong Column1. Thao tac nay phuc hổi các giá trị nhập vào Colmnn1 thành các giá trị ban đầu của chúng nếu EuenToOdd chạy ngay sau khi thd tue OddToEven chay.
Tap Hdp Errors
Tập hợp Errors cho phép bạn bay một số lỗi xuất hiện trong một trình ứng dụng ADO. Nó cũng trả về các lỗi từ một nhà cung cấp OLE DB. Điều kiện của lỗi đơn có thé tra vé cdc lỗi phức tạp, mỗi nguyên nhân của đối tượng Error mới được đặt trong tập hợp Errors. Một vài lỗi gây ra kết thúc chương trình; một vài lỗi khác thì không. Một lỗi mới của chương trình sẽ tự động xóa tập hợp Errors cho các giá trị đưa vào các lỗi đã liên hệ với nó. Một vài lỗi ADO đưa vào đối tượng Err hon la tap hgp Errors, nhung ban có thé sử dụng được tập hợp mới nhat. Tap hgp Errors là thích hợp nhất cho việc xử lý các lỗi dựa vào kết nối (connection - based errors) đã trả về từ cơ sở dữ liệu từ xa thông qua nhà cung cấp OLE DB của nó.
Các đối tượng Errors trong tap hgp Errors co nam thuộc tính giúp bạn tập hợp nhiều thông tin để bạn có thể điều khiển dé dang tới chúng bằng logic chương trình. Các thuộc tính Number va Description cho đối tượng Err tương đương với các thuộc tính đó.
Các thuộc tính này bổ sung cho một đối tượng khác. Thuộc tính Number trả về một số duy nhất để nhận đạng một lỗi và thuộc tính Deseription trả về một chuỗi ngắn gọn để mô tả lỗi. Thuộc tính NatiueError đưa một mã lỗi cụ thể của nhà cung cấp. Nếu ban thường làm việc với một nơi cung cấp đặc biệt, thuộc tính này phải cung cấp thông tin hữu ích về cách giải quyết lỗi. Thuộc tính Source
152
Chương 2: CAC MO HINH TRUY CAP DU LIEU
đặt tên đối tượng hoặc trình ứng dụng đã tạo ra lỗi. Thuộc tính SQLSiate có thể chứa các thông báo lỗi về cú pháp của câu lệnh SQL bắt nguồn từ server của cơ sở dữ liệu để bạn đưa ra yêu cầu của mình.
Thủ tục OpenLookOniyErrors dưới đây là sự thích ứng của một thủ tục trước đây để tạo ra tác động về thuộc tính Mode của déi tugng Connection. Cai đặt read-only cho thuộc tính này là nguyên nhân gây ra lỗi khi bạn cố gắng cập nhật vào một cơ sở dữ liệu. Lỗi này không tham gia vào tập hợp #rror. Bạn có thể bẫy lỗi và điêu khiển dé dang lại nó bằng cách sử dụng đối tượng Er.
Thành viên cuối cùng của tập hợp Errors cũng xuất hiện trong đối tượng Err. Logic bẫy lỗi (error-trapping logic) ở cuối thủ tục tránh việc in hai dòng có số và mô tả đồng nhất.
Sub OpenLookOnlyErrors() Dim cnni As New Connection Dim rsCustomers As Recordset
Dim errLoop As Error, intInErrors As Integer On Error GoTo LookOnlyTrap
cnn1,Mode = adModeRead
cnn†1.Open “Provider=Microsoft. Jet. OLEDB.4.0;" & _
*Data Source=C:\Program Files\'_ “Microsoft Office\Office\ “ &_
*Samples\WNorthwind.mdb;"
"Viết từ Northwind không đúng chính tả để sinh ra lỗi có thể bẫy được.
‘ cnn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
“Data Source=C:\Program Files\Microsoft Office\Office\&_
“Samples\Northwinds.mdb;"
'Phần tử No Errors cho nhà cung cấp có lỗi sai chính tả
' cnn1.Open "Provider=Microsoft.Jets.OLEDB.4.0;" & _
“Data Source=C:\Program Files\Microsoft Office\Office” &_
“Samples\Northwind.mdb;"*
153
Set rsCustomers = New ADODB. Recordset - : +eCustomers. ActiveConnection = =ennt
'Viết từ rsCustomers sai chính tả để tạo ra lỗi có số hiệu 424 không thể bẫy:
được. -
'Viết từ cnn lọ cnn để tạo lỗi cú số hiệu 3001 khụng thể bẩy được. "
ti rsCuStomer.AcliveConnection = chn1 ANGE ai GIÁ LÀN 'Viết tên bằng dữ liệu "Customei* để tạo ta lỗi có số hiệu -214721 7900 có ~ thể bẫy lỗi được... --.... ". . = .
rsCustomers/Open “Customers. thản
re fee, eye!
‘Calc dat adModeRead. cho. ean, Mode. sinh ưa lỗi (4251) ở đây.
"Thông báo hiện ra dong: enn. Mode. có hể cấp nhật-được.
rsCustomers. Fields(* Customerlb* )= = 'xxxxx"
rsCustomers.Update .
Debug.Print reCustomers.Fields("CuslomerlD”) rsCustomers.Close
LookOnlyTrap:
intlnErrors = 0
For Each errLoop In cnn1.Errors
Debug.Print errLoop.Number,errLoop. Description cha
intinErrors = intInErrors +1 ơ
Next errLoop :
lf intInEfrors =0 Then
Debug.Print Err.Number, Err.Description ` End If |
beer
Po poe
ơ eek NE rt
edge EM ok
End Sub
Thủ tục OpenLookOnlyErrors tạo một vài kiểu lỗi khác nhau và cố gắng để ghi vào kết nối read-only. Hình 2-9 trình bày các cửa sé VBE Code va Immediate cho .các lỗi này, Các thông b báo về các mã lỗi đây đủ chỉ tiết là từ tập hợp Errors. : ..
be
154
@ chuong 2: CAC MO HINH TRUY CAP-DU LEU Paps ona EB
“the $Y bye Sree few Tile Ard bower We
on
by
Hình 2-9. Các cửa sổ VBE Code va immediate trinh bay.ma Idi tt’ cdc
kiểu lỗi đặc trưng. : ị
Các lỗi còn lại là các lỗi ADO báo cáo từ đầu đến cuối đối tượng Err. Chỉ có hai lỗi có đặc tính số âm lớn của tập hợp Er7ors.
Các lỗi còn lại là các lỗi ADO sắn có qua đối tượng Err. Một lỗi trong chuỗi nối kết (lỗi số 3706) vẫn không, báo cáo, qua. tập hợp Errors. Điều này, cộng với sự kiện thành phân cuối cùng của tập hop Errors xuất hiện trong đối tượng. Err, chỉ; VÀO, khả năng của việc bãy lỗi với đối tugng Err. Cane | thiết kế _— tự như thế này để làm việc cho các lỗi VBA-: HOGA Winn . vids Dylan fed
ce GHI CHÚ: Bạn cú thể chốn' cõu lệnh. Option ExpliờiFeng vỳẹg khai bỏo chung của một module để loại trừ khả ủăiiJ'Của cất lỗi
nào đó, như việc tham chiếu đến cắc đối tượng khống E6:
Thủ tục OpenLookOniyErrors dưới đây dưa. ra. một. vài: phương phỏp cú sắn để xử lý lỗi với đối tượng Er?..Thủ.tạe.này:tạứĂra một lỗi kể cả ghi chú rnô 'bả chỉ tiết sự sửa đổi: đoạn:mã sân: thiết. để tạo lỗi khác. Nó cũng đáp ứng cụ thể tới hái lỗi và "kể cải thường trình thủ tục xử lý lỗi phổ biến cho các thet tye khác? Na
J. = .=
m Trường hợp lỗi 3251, thủ tục thay đổi kiểu khóa để các recordset có thể được cập nhật. Lỗi này xuất hiện bởi vì kiểu khóa bị sai. Để sửa vấn để này, mã xử lý lỗi đóng recordset , tái lặp lại thuộc tính Uock7ype và mở lại đối tượng recordset.
cũ
mẽ Với lỗi 424, thủ tục không cố gắng sửa lỗi nhưng cảnh báo cho người sử dụng biết khả năng gây ra lỗi. Lỗi này xuất hiện khi một phương pháp được gọi hoặc một thuộc tính được thiết lập dựa vào một biến không khai báo như một đối tượng. Ví dụ, một lỗi kỹ thuật in có thể gây ra vấn dé nay.
m Nếu lỗi không có số hiệu lỗi 3251 hoặc 424, thường trình thủ tục in số và các thuộc tính mô tả cho đối tượng Err.
Sub LoopToUsingErrors( ) On Error GoTo DerrorsTrap Dim cnn1 As Connection Dim rsMyTable As Recordset
Set cnnt = New ADODB.Connection
cnn1.Open = “Provider=Microfoft.Jet.OLEDB.4.0 ; “ &_
“Data Source=C:\Program Files\Microsoft Office\Office\” & _
“Samples\Northwind.mdb ;”
Set rsMyTable = New ADODB. Recordset 'Mở recordset với các giá trị mặc định.
OpenRSMytable:
rsMyTable.Open “My Table”, cnn1 'Vòng lặp quét qua recordset.
Do Until rsMytable. EOF
'Tạo lỗi 424 bằng cách dùng dòng sau thay cho dòng trước r Do Until rsMyTables.EOF
If rsMytable.Fields(0) = 4 Then
‘Dong nay tao ra lỗi 3251 bởi vi recordset là chỉ đọc.
Chương 2: CÁC MÔ HÌNH TRUY CAP DU LIEU
reMyTablie.Fields(0) = 88 Else
Debug.Print.rsMyTable.Fields(0), rsMyTable.Fields(1) End If
rsMyTable.Close ErrorsExit:
Exit Sub DErrorsTrap:
If Err.Number = 3251 Then
MsgBox “OLEDB Provider does not support operation. “ & _
“Find another way to get the job done or get a new “ & _
“OLEDB Provider. Error happened in LoopToDeleteErrors.”
Debug.Print rsMyTable.LockType rsMyTable.Close
rsMyTable.LockType = adLockOptimistic Resume OpenRSMyTable
Elself Err.Number = 424 Then
MsgBox "The code tried to do something requiring an” &_
“object, such as set a property or invoke a method, “ &_
“but the code did not have an object. Check spelling.”
Else
MsgBox “Check Immediate window for error # and desc.”
Debug.Print.Err.Number, Err.Description End If
Resume ErrorsExit
End Sub
Thư Viện ADOX
Thư viện ADOX cung cấp sơ đồ và các công việc an toàn. Bạn sử dụng thư viện này để quản lý các đối tượng và chỉnh sửa kiến trúc thiết kế cơ sở đữ liệu trong trình ứng dụng của bạn. Ngoại trừ đối tượng Cafalog, tất cả các đối tượng khác có sự tương hợp với các
157
tập hợp. Bạn sử dụng các tập hợp này để thêm và tổ chức các đối tượng mới trong Cœfaiog. Các đối tượng đã chọn nhự các bảng, chỉ mục, khóa, và các cột, có các tập hợp Properiies. Bạn sử dụng chúng để quản lý hành vi của các đối tượng trong một. trình ng dụng.
Bạn quản lý các tập hợp sers và Groups để điều khiển quyền hạn cho các đối tượng ADOX khác, như các bảng, các view, vã 'c&c thủ tục. Hình 2-10 trình bày một sơ đồ của thư viện ADOX#%“ ''+
Cataiog_|
Hình 2-10. Thư ...