adodb

62
================== 1- Mở tập tin XXX.mdb không mật khẩu MÃ: CHỌN TẤT CẢ Set objConnection = CreateObject("ADODB.Connection") 'Kho'i tao một kêt nôi objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = XXX.mdb" ================== 2- Mở tập tin Tinhluong.mdb có mật khẩu MÃ: CHỌN TẤT CẢ Set objConnection = CreateObject("ADODB.Connection") 'Kho'i tao một kêt nôi objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & App.Path & "\Tinhluong.mdb;" & _ "Persist Security Info=False;" & _ "Jet OLEDB:Database Password =thuytrang" Dùng Data1: gửi bởi xuanquy_th vào ngày Thứ 6 21/12/2007 7:36 am MÃ: CHỌN TẤT CẢ Global DLieu As DatabaseSet DLieu = OpenDatabase("C:\QLBN.mdb", False, False, ";PWD=PassWord") Set Data1.RecordSet=DLieu.OpenRecordSet("Select * From tblName") gửi bởi thuat vào ngày Chủ nhật 24/02/2008 6:52 pm MÃ: CHỌN TẤT CẢ With Data1.DatabaseName = App.Path & "\Data.mdb".RecordSource = "TB_Ho".Connect = ";Pwd=thuat;".RefreshEnd With ================== 3- Các hằng cần khai trước khi duyệt tables: dần dần sẽ hiểu! CursorTypeEnum Values: MÃ: CHỌN TẤT CẢ Const adOpenUnspecified = -1 Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic = 2 Const adOpenStatic = 3 1

description

adodb

Transcript of adodb

Page 1: adodb

==================1- Mở tập tin XXX.mdb không mật khẩu

MÃ: CHỌN TẤT CẢ

Set objConnection = CreateObject("ADODB.Connection")   'Kho'i tao một kêt nôi

objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = XXX.mdb"

==================2- Mở tập tin Tinhluong.mdb có mật khẩu

MÃ: CHỌN TẤT CẢ

Set objConnection = CreateObject("ADODB.Connection")   'Kho'i tao một kêt nôi

objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source =" & App.Path

& "\Tinhluong.mdb;" & _                      "Persist Security Info=False;" & _     

"Jet OLEDB:Database Password =thuytrang"

Dùng Data1:gửi bởi xuanquy_th vào ngày Thứ 6 21/12/2007 7:36 am

MÃ: CHỌN TẤT CẢ

Global DLieu As DatabaseSet DLieu = OpenDatabase("C:\QLBN.mdb", False, False,

";PWD=PassWord")

Set Data1.RecordSet=DLieu.OpenRecordSet("Select * From tblName")

gửi bởi thuat vào ngày Chủ nhật 24/02/2008 6:52 pm 

MÃ: CHỌN TẤT CẢ

With Data1.DatabaseName = App.Path & "\Data.mdb".RecordSource = "TB_Ho".Connect =

";Pwd=thuat;".RefreshEnd With

==================3- Các hằng cần khai trước khi duyệt tables: dần dần sẽ hiểu!CursorTypeEnum Values:

MÃ: CHỌN TẤT CẢ

Const  adOpenUnspecified = -1

Const adOpenForwardOnly = 0

Const adOpenKeyset = 1

Const adOpenDynamic = 2

Const adOpenStatic = 3

LockTypeEnum Values:

1

Page 2: adodb

MÃ: CHỌN TẤT CẢ

Const adLockUnspecified = -1

Const adLockReadOnly = 1

Const adLockPessimistic = 2

Const adLockOptimistic = 3

Const adLockBatchOptimistic = 4

CommandTypeEnum Values:

MÃ: CHỌN TẤT CẢ

Const adCmdUnspecified = -1

Const adCmdText = 1

Const adCmdTable = 2

Const adCmdStoredProc = 4

Const adCmdUnknown = 8

Const adCmdFile = 256

Const adCmdTableDirect = 512

ExecuteOptionEnum Values:

MÃ: CHỌN TẤT CẢ

Const adOptionUnspecified = -1

Const adAsyncExecute = 16

Const adAsyncFetch = 32

Const adAsyncFetchNonBlocking = 64

Const adExecuteNoRecords = 128

Const adExecuteStream = 256

Const adExecuteRecord = 512

EventStatusEnum Values:

MÃ: CHỌN TẤT CẢ

Const adStatusOK = 1

Const adStatusErrorsOccurred = 2

Const adStatusCantDeny = 3

Const adStatusCancel = 4

Const adStatusUnwantedEvent = 5

==================4- Duyệt các Tables: Duyệt TableYYY==================Set objRecordSet = CreateObject("ADODB.RecordSet") 'Kho'i tao môt bô duyêt các Records' chú y khai 2 ha`ng sô sau adOpenStatic, adLockOptimisticobjRecordSet.Open "SELECT * FROM TableYYY", objConnection, adOpenStatic, adLockOptimistic'Duyêt qua Recorset: Goi hàng 1 và di chuyên Ðên hàng cuôi cùngobjRecordSet.MoveFirst'Ngang Ðây, ta có thê biet sô luong record:MsgBox objRecordSet.RecordCount'Bat Ðâu duyêt record

2

Page 3: adodb

Do Until objRecordSet.EOF'. . . Làm viêc gì o' Ðây trong khi duyêt Recorset: Ví du: MsgBox Item("ComputerName")MsgBox objRecordSet.Fields.Item("ComputerName")'Nêu muôn, xóa record, updateobjRecordSet.Delete'objRecordSet.Update '<-- Ðu`ng nên Ðê o Ðây, mà Ðê ngoai vòng lap'. . .objRecordSet.MoveNextLoopobjRecordSet.Update'Ðóng các kêt nôiobjRecordSet.CloseobjConnection.Close

==================5- Thêm mới==================objRecordSet.Open "SELECT * FROM TableYYY", objConnection, adOpenStatic, adLockOptimistic ' Ðã khai báo o' trên, viêt tiêp ..'Goi phuong thu'c AddNewobjRecordSet.AddNew'Câu trúc: objRecordSet("Field Name") = "Field Value"' nghia là tai field "Category" ghi thêm record "Quán Net"objRecordSet("Category") = "Quán Net"objRecordSet("ComputerName") = "Máy A1"'tuong tu' nhu' trên . . .objRecordSet("RecordNumber") = "12"objRecordSet("TimeWritten") = "12:30"objRecordSet("UserName") = "Khách" 'Goi phuong thu'c UpdateobjRecordSet.Update

==================6- Đường dẫn tương đối của file *.mdb==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24321đường dẫn tương đối, nghĩa là đường dẫn tính từ project. Ví dụ:MÃ: CHỌN TẤT CẢcn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0 ;" & _ "Data Source =" & App.Path & "\Tinhluong.mdb;" & _ "Persist Security Info=False;" & _ "Jet OLEDB:Database Password =thuytrang"

Cụ thể trong code code trên, đường dẫn là App.Path & "\Tinhluong.mdbApp.Path là vị trí bất kỳ, "tương đối" là thế. Rất tiện phải không?

a- Câu trên có thể viết gọn một chút:MÃ: CHỌN TẤT CẢcn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0 ;" & _ "Data Source = Tinhluong.mdb;" & _ "Persist Security Info=False;" & _ "Jet OLEDB:Database Password =thuytrang"

3

Page 4: adodb

b- Trong một số trường hợp, khi chương trình nằm trực tiếp trên ổ đĩa mà không ở trong Folder, câu "Data Source =" & App.Path & "\Tinhluong.mdb;" sẽ bị sai đường dẫn.Để tổng quát hóa các trường hợp nêu trên, ta phải ghi hơi dài một chút:MÃ: CHỌN TẤT CẢDim Path$: Path=App.Path If Right(Path, 1) <> "\" Then Path = Path & "\"cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0 ;" & _ "Data Source =" & Path & "Tinhluong.mdb;" & _ "Persist Security Info=False;" & _ "Jet OLEDB:Database Password =thuytrang"

c- Nói thêm cho rõ:* Nếu DataSource nằm cùng folder với chương trình, ta ghi:-->MÃ: CHỌN TẤT CẢ"Data Source = Tinhluong.mdb;"

* Nếu DataSource nằm trong một folder, mà Folder ấy mới nằm cùng chương trình, ta ghi:--->MÃ: CHỌN TẤT CẢDim Path$: Path=App.Path If Right(Path, 1) <> "\" Then Path = Path & "\" "Data Source =" & Path & "Tên Folder\Tinhluong.mdb;"

==================7- Mở cùng lúc nhiều tables==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24338

1. Const adOpenStatic = 32. Const adLockOptimistic = 33. 'Tâp tin db1.mdb có 3 Table1, Table2, table3 có ít du liêu trong môi Table4. Set objConnection = CreateObject("ADODB.Connection")5. Set objRecordSet = CreateObject("ADODB.Recordset")6. Set objRecordSet2 = CreateObject("ADODB.Recordset")7. Set objRecordSet3 = CreateObject("ADODB.Recordset")8.  9. objConnection.Open "Provider= Microsoft.Jet.OLEDB.4.0; " & "Data Source=db1.mdb"10.  11. objRecordSet.Open "SELECT * FROM Table1", objConnection, adOpenStatic,

adLockOptimistic12. objRecordSet.MoveFirst13.  14. objRecordSet2.Open "SELECT * FROM Table2", objConnection, adOpenStatic,

adLockOptimistic15. objRecordSet2.MoveFirst16.  17. objRecordSet3.Open "SELECT * FROM Table3", objConnection, adOpenStatic,

adLockOptimistic18. objRecordSet3.MoveFirst19.  20. Do Until objRecordSet.EOF21.     MsgBox objRecordSet.Fields.Item("aaa")22.     objRecordSet.MoveNext23.     'Làm gì Ðây? ...

4

Page 5: adodb

24. Loop25.  26. Do Until objRecordSet2.EOF27.     MsgBox objRecordSet2.Fields.Item("qqq")28.     objRecordSet2.MoveNext29.     'Làm gì Ðây? ...30. Loop31.  32. Do Until objRecordSet3.EOF33.     MsgBox objRecordSet3.Fields.Item("eee")34.     objRecordSet3.MoveNext35.     'Làm gì Ðây? ...36. Loop37. objRecordSet.Close38. objRecordSet2.Close39. objRecordSet3.Close40. objConnection.Close

==================8- Cách lấy CSDL Access có password từ máy khác==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24339

==================9- Cấu trúc vòng lặp: Do While . . . loop trong duyệt recordsethttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24340

gửi bởi longtep vào ngày Thứ 7 25/10/2008 8:30 pm 

MÃ: CHỌN TẤT CẢ

1. Do While Not rs.EOF

2. A(n) = rs.Fields("HOVATEN")

3. n = n + 1

4. Loop

'khi em chay thì bị lỗi là: Runtime error '9' Subscrip out of range

gửi bởi thuat vào ngày Thứ 7 25/10/2008 8:56 pm Thiếu câu lệnh di chuyển sang bản ghi sau trong vòng lặp.

MÃ: CHỌN TẤT CẢ

1. Do While Not rs.EOF

2.       A(n) = rs.Fields("HOVATEN")

3.       n = n + 1

4.       rs.MoveNext ' <---- bô sung

5. Loop

==================10- Nối dữ liệu từ nhiều bảng trong Access2000?==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24358

đây là cách nối DL cũng khá cơ bản,nguồn pcworld.com.vn

5

Page 6: adodb

Nếu lập trình bằng VB 6.0, bạn có thể dùng các đối tượng ADO để truy xuất database cho dễ dàng và độ tin cậy cao. Các đối tượng ADO thường dùng là Connection, Recordset, Command. Sau đây là qui trình điển hình để xây dựng 1 ứng dụng VB copy dữ liệu từ table của database này sang database khác:

1. Để đoạn code VB độc lập với công nghệ database mà nó truy xuất, bạn hãy định nghĩa 2 DSN (Data Source Name) kết hợp với 2 database cần truy xuất: database chứa table nguồn và database chứa table đích. Để định nghĩa 1 DSN kết hợp với 1 database, từ Windows, bạn hãy vào Control Panel.Administrative Tools.Datasource (ODBC).

2. Chạy VB, tạo project quản lý ứng dụng dạng "Standard EXE". Sau khi Form trống được tạo ra, bạn hãy thiết kế trực quan form có dạng như sau:

Hãy đặt tên cho 3 textbox lần lượt là txtTable, txtDSN1, txtDSN2. Đặt tên cho Button là btnStart. Nhấn kép chuột vào button Start để tạo thủ tục xử lý sự kiện Click cho nó, cửa sổ soạn code sẽ hiển thị.

3. Chọn menu Projects.References, duyệt tìm và chọn mục "Microsoft ActiveX Data Objects 2.x Library" rồi nhấn button Ok để "add" thư viện chứa các đối tượng ADO vào Project ứng dụng.

4. Viết thủ tục xử lý Click chuột cho button Start như sau:

MÃ: CHỌN TẤT CẢ

1. 'Thủ tục xử lý Click chuột vào button Start

2. Private Sub btnStart_Click()

3. 'Khai báo các biến cần dùng

4. Dim Connection1 As ADODB.Connection

5. Dim Connection2 As ADODB.Connection

6. Dim Command1 As ADODB.Command

7. Dim Command2 As ADODB.Command

8. Dim RecordSet1 As ADODB.Recordset

9. Dim RecordSet2 As ADODB.Recordset

10. Dim strSQL As String

11. Dim strBuf As String

12. 'Tạo connection tới database nguồn

13. Set Connection1 = New ADODB.Connection

14. Connection1.Open "DSN=" & txtDSN1.Text

15. 'Tạo recordset chứa các data của table nguồn

16. Set RecordSet1 = New ADODB.Recordset

17. RecordSet1.Open txtTable.Text, Connection1, adOpenStatic, adLockReadOnly,

adCmdTable

18. 'Tạo connection tới database đích

19. Set Connection2 = New ADODB.Connection

20. Connection2.Open "DSN=" & txtDSN2.Text

21. 'Tạo command làm việc với database đích

22. Set Command2 = New ADODB.Command

6

Page 7: adodb

23. Command2.ActiveConnection = Connection2

24. 'xây dựng SQL tạo Table đích

25. strSQL = "CREATE TABLE " & txtTable.Text & "("

26.  

27. 'duyệt tìm từng field của table nguồn

28. fStart = 1

29. For Each fld In RecordSet1.Fields

30. 'tìm tên và kiểu của field

31. Select Case fld.Type

32. Case 2

33. strBuf = "Integer"

34. Case 3

35. strBuf = "Long"

36. Case 5

37. strBuf = "Currency"

38. Case 6

39. strBuf = "Double"

40. Case 11

41. strBuf = "Logical"

42. Case 202

43. strBuf = "Text"

44. Case 135

45. strBuf = "Date"

46. Case Else

47. MsgBox "Type với mã " & fld.Type & "chưa được xử lý!!!"

48. End Select

49. If fStart Then

50. strSQL = strSQL & fld.Name & " " & strBuf

51. fStart = 0

52. Else

53. strSQL = strSQL & ", " & fld.Name & " " & strBuf

54. End If

55. Next fld

56. strSQL = strSQL & ")"

57. 'Tạo table trên database đích có cùng cấu trúc như table nguồn

58. Command2.CommandText = strSQL

59. Command2.Execute

60. 'Tạo recordset quản lý dữ liệu của table đích

61. Set RecordSet2 = New ADODB.Recordset

62. RecordSet2.Open txtTable.Text, Connection2, adOpenKeyset, adLockOptimistic,

adCmdTable

63. 'duyệt copy từng record từ nguồn sang đích

64. While Not RecordSet1.EOF

65. 'tạo record mới trên table đích

7

Page 8: adodb

66. RecordSet2.AddNew

67. For i = 0 To RecordSet1.Fields.Count - 1

68. 'copy nội dung của field

69. RecordSet2.Fields(i).Value = RecordSet1.Fields(i).Value

70. Next i

71. RecordSet2.Update

72. 'di chuyển đến record kế

73. RecordSet1.MoveNext

74. Wend

75. 'đóng các đối tượng đã dùng lại

76. RecordSet1.Close

77. Connection1.Close

78. Connection2.Close

79. End Sub

80.  

5. Chọn menu Run.Start để chạy thử ứng dụng. Khi Form hiển thị, bạn hãy thử nhập tên của table cần copy, tên của DSN miêu tả database chứa table nguồn, tên của DSN miêu tả database đích rồi nhấn button Start.

Lưu ý nếu 2 database nguồn và đích được tạo ra bởi 2 hệ quản trị database khác nhau (Foxpro, Access, SQL Server, MySQL, Oracle...) thì có thể xuất hiện vấn đề không tương thích về kiểu dữ liệu của các field dữ liệu. Một lưu ý khác là đoạn code VB do chúng tôi viết chỉ chứa những hoạt động thiết yếu, chứ chưa đầy đủ, còn thiếu những đoạn code xử lý lỗi cho từng hoạt động truy xuất database. Để có được ứng dụng hoàn chỉnh, bạn cần bổ sung thêm những hoạt động xử lý lỗi còn thiếu.

==================11- Nhanh hơn trong truy xuất CSDL==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24359

Khi mở một new project, bạn chỉ cần chép code sau là chạy

MÃ: CHỌN TẤT CẢ

1. Set cn = CreateObject("ADODB.Connection")

2. Set rs = CreateObject("ADODB.RecordSet")

Tuy nhiên tốc độ thực thi sẽ chậm, chỉ thích hợp cho dữ liệu nhỏ

Với code sau, chạy sẽ báo lỗi:

MÃ: CHỌN TẤT CẢ

1. Dim cn As New ADODB.Connection

2. Dim rs As New ADODB.Recordset

Khắc phục bằng cách: Project \ References \ chọn Microsoft ActiveX Data Objects 2.8 libraryTrường hợp nầy tốc độ thực thi sẽ nhanh hơn nhiều, thích hợp dữ liệu lớn. Khi viết code được nhắc

==================12- Tạo file MDB bằng code==================

8

Page 9: adodb

http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24367

Tạo file MDB bằng code

MÃ: CHỌN TẤT CẢ

1. Dim cat As New ADOX.Catalog

2.  

MDB có mật khẩu:

MÃ: CHỌN TẤT CẢ

1. cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dir$ & "\

filename.mdb" & ";Jet OLEDB:Database Password=" & strPwd & ";"

MDB không mật khẩu:

MÃ: CHỌN TẤT CẢ

1. cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dir$ & "\

filename.mdb" & ";"

Tạo Table trong file MDB

MÃ: CHỌN TẤT CẢ

1.    Dim rsTable New ADOX.Table

2.     With rsTable

3.         .Name = "TableName"

4.         .Columns.Append "ID", adInteger

5.         .Columns.Append "Field1", FieldType, FieldWidth

6.         .Columns.Append "Field2", adVarWChar, 50

7.         .Columns.Append "Field3", adBoolean

8.         .Columns.Append "Field4", adDouble

9.         .Columns("Field2").Attributes = adColNullable 'Cho phép Null

10.         .Columns("Field4").Properties("Default").Value = 0 'Giá trị mặc định là

0

11.          With .Columns("ID")

12.             Set .ParentCatalog = cat 'Very important

13.             .Properties("AutoIncrement") = True 'Tự động tăng số

14.             .Properties("Seed") = n 'Mỗi lần tự động tăng n

15.          End With

16.  

17.     End With

18.     cat.Tables.Append rsTable

9

Page 10: adodb

==================13- Tạo một field mới trong table đang tồn tại==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24374

Code sau đây tạo field "qqq" text 50 ký tự trong table1 có sẵn của file db1.mdb

MÃ: CHỌN TẤT CẢ

1. Private Sub CreateField(AccessPath$, TableName$)

2. Set objConnection = CreateObject("ADODB.Connection")

3.     objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" &

AccessPath

4.     objConnection.Execute "alter table Table1 ADD COLUMN qqq Text(50)"   '<-

thêm côt qqq trong table

5.     objConnection.Close  ' Câu trên, thay tên table và tên Field thích ho'p

6. End Sub

7.  

8. Private Sub Form_Load()

9. Call CreateField("C:\db1.mdb", "Table1")

10. End Sub

==================14- Các thông số cho định dạng field được tạo==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24386

MÃ: CHỌN TẤT CẢ

1. objConnection.Execute "alter table Table1 ADD COLUMN qqq Text(50)"

qqq TEXT(50) định dạng TEXT 50 ký tự, mặc định cho phép 255 ký tựqqq TEXT cho phép 255 ký tựqqq COUNTER định dạng AutoNumberqqq INTEGER qqq DATETIMEqqq MEMO cho phép trên 255 ký tự

==================15- Tạo Table mới kèm fields==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24387

1. Private Sub CreateField2(AccessPath$)2.     'Tao table mo'i "Table2" kèm fields "ID" và "qqq"3. Set objConnection = CreateObject("ADODB.Connection")4.     objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & AccessPath5.     objConnection.Execute "CREATE TABLE Table2(" & "ID COUNTER ," & "qqq MEMO)"6.     objConnection.Close  ' Câu trên, thay tên table và tên Field thích ho'p7. End Sub8.  9. Private Sub Form_Load()10. Call CreateField2("C:\db1.mdb")11. End Sub12.  

==================16- Xóa field==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24388

10

Page 11: adodb

1. Private Sub DelField(AccessPath$)2. Set objConnection = CreateObject("ADODB.Connection")3.     objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & AccessPath4.     objConnection.Execute "alter table Table1 drop column qqq "   '<- huy côt qqq

trong table5.     objConnection.Close  ' Câu trên, thay tên table và tên Field thích ho'p6. End Sub7.  8. Private Sub Command1_Click()9. Call DelField("C:\db1.mdb")10. End Sub11.  

==================17- Lưu ý Reference Object==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24394hoangthu1974 đã viết:Các bạn mới làm code chú ý, đừng sử dụng lệnh CreateObject để tạo các Reference Object vì:1. Cách này ít gây lỗi nhưng sẽ khó đóng gói vì chương trình đóng gói không truy vấn được các Reference Object.2. Các bạn không biến trong Object có các Property hay Event nào để sử dụng.Ví dụ:Số dòng Bật/Tắt | Mở rộng/Thu gọn | Chọn tất cảDim BienSet Bien = CreateObject("scripting.FileSystemObject")

Thay bằng:Số dòng Bật/Tắt | Mở rộng/Thu gọn | Chọn tất cảDim Bien As New Scripting.FileSystemObject

Khi nào thành Expert rồi hay dùng CreateObject.

Để viết:

MÃ: CHỌN TẤT CẢ

1. Dim cn As New ADODB.Connection

2. Dim rs As New ADODB.Recordset

--> Project \ References \ chọn Microsoft ActiveX Data Objects 2.8 library

Để viết:

MÃ: CHỌN TẤT CẢ

1. Dim cat As New ADOX.Catalog

2. Dim rsTable New ADOX.Table

11

Page 12: adodb

--> Project \ References \ chọn Microsoft ADO Ext 2.8 for DDL and Security

Để viết:

MÃ: CHỌN TẤT CẢ

1. Dim objAccess As New Access.Application

--> Project \ References \ chọn Microsoft Access (10.0) 11.0 Object Library

==================18- Xóa toàn bộ các Records, Table chỉ còn các fields trống rỗng:==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24428MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adOpenStatic = 3: Const adLockOptimistic = 3

3. Set objConnection = CreateObject("ADODB.Connection")

4. Set objRecordset = CreateObject("ADODB.Recordset")

5. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source = 'E:\

win\desktop\db1.mdb'"

6. objRecordset.Open "Delete * FROM Table1", objConnection, adOpenStatic,

adLockOptimistic

7. objConnection.Close

8. End Sub

==================19- Xóa luôn Table, Dùng ADODB==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=0#p24429

Xóa luôn Table, Dùng Access

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Set acc = CreateObject("Access.Application")

3. acc.OpenCurrentDatabase "E:\win\desktop\db1.mdb"

4. acc.DoCmd.DeleteObject acTable, "Table1"

5. End Sub

bổ sung 16/1119- Xóa luôn Table, Dùng ADODB

MÃ: CHỌN TẤT CẢ

12

Page 13: adodb

1. Dim objCatalog As New ADOX.Catalog

2. Dim objConnection As New ADODB.Connection

3. objConnection.Open "Provider= Microsoft.Jet.OLEDB.4.0; " & "Data

Source=db1.mdb"

4. Set objCatalog.ActiveConnection = objConnection

5. objCatalog.Tables.Delete "Table1"

6. objConnection.Close

==================20- Lệnh Find trong ADODB==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24439

Mình có dòng lệnh như sau:

MÃ: CHỌN TẤT CẢ

1. dim hs as adodb.recordset

2. set hs=new adodb.recordset

3. sql="select mahocsinh,tenhocsinh from bangma"

4. hs.open sql,connec,3,2

Bây giờ mình muốn tìm trong con trỏ hs cột tenhocsinh xem có ai có tên là "Nguyễn Văn A" không thì tìm như thế nào? Bạn nào biết cách sử dụng Hs.Find thì chỉ cho mình với.

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adOpenStatic = 3: Const adLockOptimistic = 3

3. Dim cn As New ADODB.Connection

4. Dim hs As New ADODB.Recordset

5.  cn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = db1.mdb"

6. hs.Open "SELECT * FROM bangma", cn, adOpenStatic, adLockOptimistic

7. hs.MoveFirst

8. hs.Find "tenhocsinh='nguyen van a'"

9. If Not hs.EOF Then

10. MsgBox hs.Fields.Item("mahocsinh") & vbTab & hs.Fields.Item("tenhocsinh")

11. Else

12. MsgBox "Không tìm thây"

13. End If

14. End Sub

==================21- Làm sao khi ADODB.Recordset không cho mở giá trị NULL? http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24443

13

Page 14: adodb

Khi em kết nối VB 6.0 với CSDL Access bằng ADODB.Recordset có 1 trường mang giá trị Null thì không cho mở trường đó. Nếu không sử dụng trường đó thì mở record được bình thường xin chỉ giúp

gửi bởi vietteiv vào ngày Thứ 2 20/10/2008 8:35 pm khi truy xuất csdl bị lỗi thì bác truongphu ko nên dùng bẫy lỗi resume next, vì có thể mình sẽ bỏ sót 1 số lỗi khác ngoài ý muốn. cho nên trong trường hợp này mình sẽ bẫy lỗi bằng câu lệnh kiểm tra recordset trước khi cho load lên datagrid. ví dụ:

MÃ: CHỌN TẤT CẢ

1. 'thực hiện việc kết nối database

2. ....

3. 'kết nối đến table cần truy xuất

4. rs.Open "Select * from table1", CN, adOpenStatic, adLockOptimistic

5. if rs.recordcount > 0 then

6.  for i=1 to rs.recordcount

7.    if not IsNull(rs.Field("tên field cần lấy dữ liệu")) then

8.      'load dữ liệu lên control

9.       grid.column(0).text=rs.Field("tên field cần lấy dữ liệu")

10.    else

11.       grid.column(0).text=""

12.    end if

13.    rs.movenext

14.  next i

15. else

16.  msgbox "không có mẫu tin nào"

17. end if

18.  

gửi bởi hoangthu1974 vào ngày Thứ 4 22/10/2008 4:02 pmNhưng để chương trình xử lý nhanh hơn, bạn thử cái While Not rs.EOF... Wend xem sao. Cái này nó cắm đầu chạy không cho ngưng nên sẽ xử lý nhanh hơn nhiều.Khi dùng While... Wend có nghĩa là nó sẽ ngưng khi gặp điều kiện.Ngoài ra, nhớ thêm DoEvents cho nó không bị treo máy.

==================22- Tạo khóa chính (primary key hoặc index key)==================(xem thêm bài viết tạo table của hoangthu1974)http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24479

tạo khóa chính (primary key hoặc index key), thường sử dụng cái này khi bạn muốn tạo csdl, table =code (xem thêm bài viết tạo table của hoangthu1974)

MÃ: CHỌN TẤT CẢ

1. ' ref voi ADO Ext 2.8 (msadox.dll)

14

Page 15: adodb

2.  

3. Private CAT As ADOX.Catalog

4.  

5. Private Sub CreateIndexes()

6.  

7.    On Error GoTo ErrTrap

8.   Dim IDX As ADOX.Index

9.  

10.    ' ===[Create Index 'PrimaryKey']===

11.    Set IDX = New ADOX.Index

12.  

13.    With IDX

14.       .Name = "PrimaryKey"

15.       .Columns.Append "Key"

16.       .PrimaryKey = True

17.       .Unique = True

18.       .Clustered = False

19.       .IndexNulls = adIndexNullsDisallow

20.    End With

21.  

22.    CAT.Tables("TestScores").Indexes.Append IDX

23.  

24.    ' ===[Create Index 'Key']===

25.    Set IDX = New ADOX.Index

26.  

27.    With IDX

28.       .Name = "Key"

29.       .Columns.Append "Key"

30.       .PrimaryKey = False

31.       .Unique = False

32.       .Clustered = False

33.       .IndexNulls = adIndexNullsAllow

34.    End With

35.  

36.    CAT.Tables("TestScores").Indexes.Append IDX

37.  

38.    Set IDX = Nothing

39.  

40.    Exit Sub

41.  

42. ErrTrap:

43.    'MsgBox Err.Number & " / " & Err.Description,,"Error In CreateIndexes"

44.    'Exit Sub

45.    'Resume

15

Page 16: adodb

46.  

47. End Sub

==================23- Bài tập Tính điểm chênh lệch giữa các ngày==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24504

Access em có 1 table gồm các trường: Shd (khóa chính), ngay, diem. Em muốn tạo 1 Query tính chênh lệch điễm giữa các ngày với nhau ví dụ như:Shd ngay diem chenhlech1 01/01/08 100 02 02/01/08 120 203 03/01/08 130 104 04/01/08 90 405 05/01/08 90 0Vậy phải làm sao?Em cám ơn các bác nhiều

gửi bởi pcvinh vào ngày Thứ 2 28/01/2008 11:03 am và gửi bởi HangXomChenhLech: Abs([Diem]-(Select top 1 Diem From BANG as B Where B.SHD < A.SHD Order By SHD DESC))

---------------Dùng Recorset chạy như sau:

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adOpenStatic = 3: Const adLockOptimistic = 3

3. Dim a%, b%

4. Set objConnection = CreateObject("ADODB.Connection")

5. Set objRecordSet = CreateObject("ADODB.Recordset")

6. objConnection.Open "Provider= Microsoft.Jet.OLEDB.4.0; " & "Data Source=Bai

tap.mdb"

7.  

8. objRecordSet.Open "SELECT Diem From BANG", objConnection, adOpenStatic,

adLockOptimistic

9. objRecordSet.MoveFirst

10. Do While Not objRecordSet.EOF

11. a = objRecordSet.fields("diem").Value

12. If b > 0 Then MsgBox Abs(b - a) Else MsgBox "chua có du liêu'"

13. objRecordSet.MoveNext

14. b = a

15. Loop

16.  

17. End Sub

16

Page 17: adodb

==================24- Tìm trong Database với mệnh đề WHERE==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24553

Tại mục 20 đã bàn về việc bạn nguyentrinhthu hỏi lệnh Find (Sub find thì đúng hơn)Sau đây là code tìm đơn giản không bẫy lỗi: Tìm trong file db1.mdb cùng folder tại table Table1, field "ggg" có record là "gh"

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adOpenStatic = 3: Const adLockOptimistic = 3

3. Set objConnection = CreateObject("ADODB.Connection")

4. Set objRecordSet = CreateObject("ADODB.Recordset")

5. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source =

db1.mdb"

6. objRecordSet.Open "SELECT * FROM Table1 " & "WHERE qqq = 'gh'", objConnection,

adOpenStatic, adLockOptimistic

7.  

8. MsgBox "Sô record Ðuoc Ðêm là: " & objRecordSet.RecordCount & _

9. vbCr '& "ID cua record cuôi là: " & objRecordSet.fields("id").Value

10.  

11. objRecordSet.Close: Set objRecordSet = Nothing

12. objConnection.Close: Set objRecordSet = Nothing

13. End Sub

ghi chú code trên:1- vì không có cấu trúc

MÃ: CHỌN TẤT CẢ

1. objRecordSet.MoveFirst

2. Do While Not objRecordSet.EOF

3. ...

4. objRecordSet.MoveNext

5. Loop

nên nếu có record được ghi nhận thì tốt, còn không sẽ sinh lỗiCode trên sẽ chạy êm vì đã gạt dòng gây lỗi nếu không tìm thấy record yêu cầu: & "ID cua record cuôi là: " & objRecordSet.fields("id").Value2- Đương nhiên bạn có thể viết với cấu trúc Do...EOF ... Loop nói trên, trong trường hợp nầy bạn có thể truy xuất nhiều giá trị record của các field trong Table1 để có thông tin rõ ràng.3- Set objRecordSet = Nothing là xóa hẵn objRecordSet, kết thúc làm việc và giải phóng bộ nhớ. Sau lệnh gán Nothing nầy, bạn không có quyền gọi objRecordSet.open lại nữa. Muốn thì xin khai báo như từ đầu.Ngược lại, nếu chỉ viết objRecordSet.Close thì bạn lại có quyền gọi objRecordSet.open nhẹ nhàng;

17

Page 18: adodb

MÃ: CHỌN TẤT CẢ

1. objRecordSet.Close

2. objRecordSet.open

==================25- Làm sao để kết nối đến cơ sở dữ liệu Server.==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24574Thực hiện theo hình sau:

Sau đây là code dùng DNS để mở database tên Northwind, truy xuất table Customers

MÃ: CHỌN TẤT CẢ

1. Const adOpenStatic = 3: Const adLockOptimistic = 3

2. Set objConnection = CreateObject("ADODB.Connection")

3. Set objRecordSet = CreateObject("ADODB.Recordset")

4.  

5. objConnection.Open _

6.     "Northwind;fabrikam\kenmyer;34ghfn&!j"

7. ' câu trúc: "Tên file; User ID; Mât khâu"

8. objRecordSet.Open "SELECT * FROM Customers", _

9.         objConnection, adOpenStatic, adLockOptimistic

10.  

11. objRecordSet.MoveFirst

12.  

13. MsgBox objRecordSet.RecordCount

gửi bởi sirdmit vào ngày Thứ 3 28/10/2008 2:31 pm

MÃ: CHỌN TẤT CẢ

1. '. . . .

2. db.Open "DSN=data;User ID=minh ;Password=sirdmit"

3. '. . .

ban vao trong Administrative Tools-> ODBC roi chon tab System DNS roi add database vao la ok ngay.Nguyen Ngoc Minh - [email protected]

gửi bởi hoangthu1974 vào ngày Thứ 4 05/11/2008 11:50 am 

MÃ: CHỌN TẤT CẢ

18

Page 19: adodb

1. 'Kết nối bằng quyền hệ thống

2. ConnectionString = "Provider=SQLOLEDB; Data Source=" & HostName & _

3.                 "; Integrated Security=SSPI; Persist Security Info=False" & _

4.                 "; Initial Catalog=DatabaseName" & _

5.                 "; Driver={SQL Server}; DSN=''"

6. 'Kết nối bằng quyền của SQL

7.             ConnectionString = "Provider=SQLOLEDB; Persist Security Info=False;

Data Source="& HostName & _

8.                 "; Initial Catalog=DatabaseName" & _

9.                 "; User ID=" & LoginName & _

10.                 "; Password=" & Password & _

11.                 "; Driver={SQL Server}; DSN=''"

Trong đó:+ HostName là tên máy chủ+ DatabaseName là tên database+ LoginName là tên đăng nhập SQL+ Password là mật khẩu đăng nhập SQL

==================26- Datagird có để đặt Setfocus cho 1 ô bất kỳ ?==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24685

Đưa Recorset đến vị trí mong muốn:

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Adodc1.Recordset.Move (5) 'dòng thu' 6

3. End Sub

==================27- Export dữ liệu từ excell vào access bằng VB6==================a- Chuyển file dữ liệu Excel sang file Accessb- Access qua Excelhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24770

a- Chuyển file dữ liệu Excel sang file Access

MÃ: CHỌN TẤT CẢ

Private Sub ExceltoAccess(ExcelPath$, AccessPath$)Const acImport = 0: Const

acSpreadsheetTypeExcel9 = 8Set objAccess =

CreateObject("Access.Application")objAccess.NewCurrentDatabase

AccessPath$objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9,

"Test", ExcelPath$, TrueEnd Sub

19

Page 20: adodb

Ghi chú: muốn chuyển Sheet nào thì thêm tên Sheet ấy vào sau câu code cuối, vd: chuyển Sheet2

MÃ: CHỌN TẤT CẢ

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Test",

ExcelPath$, True,"Sheet2!"

Chuyển Sheet có tên "TôngHop"

MÃ: CHỌN TẤT CẢ

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Test",

ExcelPath$, True,"TôngHop!"

Sử dụng:

MÃ: CHỌN TẤT CẢ

Private Sub Form_Load()Call ExceltoAccess("E:\win\desktop\Book1.xls", "E:\win\

desktop\New.mdb")End Sub

Đương nhiên Tập tin Excel trong đường dẫn phải có, còn đường dẫn Access KHÔNG CÓ TẬP TIN để function tạo MỚI!

Bổ sung hàm, ngày 12/3/2003có thêm tên table, tên sheetSyntax: [ Download ] [ Hide ] [ Select ] [ Expand ]

Using vb Syntax Highlighting

Private Sub ExceltoAccess(ExcelPath$, AccessPath$, TableName$, Optional ByVal SheetName$ ="Sheet1!")Const acImport = 0: Const acSpreadsheetTypeExcel9 = 8Set objAccess = CreateObject("Access.Application")objAccess.NewCurrentDatabase AccessPath$objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableName$, ExcelPath$,True, SheetName$End Sub 

Parsed in 0.003 seconds, using GeSHi 1.0.8.4

gửi bởi TTD vào ngày Thứ 2 27/10/2008 1:34 pm @truongphu: code của bác là đổ bảng excel vào một MDB mới tinh, còn cần lấy excel vào một table có sẵn của 1 file MDB có rồi thì làm sao?

MÃ: CHỌN TẤT CẢ

20

Page 21: adodb

Private Sub ExceltoAccess2(ExcelPath$, AccessPath$)Const acImport = 0: Const

acSpreadsheetTypeExcel9 = 8Set objAccess =

CreateObject("Access.Application")objAccess.OpenCurrentDatabase

AccessPath$objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9,

"Table1", ExcelPath$, TrueEnd Sub

ngoài field ID (autonumber), trên mdb có sẵn phải có các field tương đồng với Book1.xls trong một table cần import, vd Table1 khai ở trên.

gửi bởi Karlee_VN vào ngày 8/11/2008 9:31 pm Nếu em chỉ muốn lấy 1 mảng dữ liệu chứ ko lấy hết sheet thì sao ạ ?

MÃ: CHỌN TẤT CẢ

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Table1",

ExcelPath$, True, "A1:C14"

Khi chạy nó báo ko có field F1 trong table. Mặc dù em chẳng đặt field nào là field F1 trong table lẫn Excel.Tiện thể cho em hỏi, làm sao đặt được tên Field trong excel ạ

Quy định của Access thì trong Table phải có tên các field để truy vấn.Tôi có viết hướng dẫn ở dưới phần code: "ngoài field ID (autonumber), trên mdb có sẵn phải có các field tương đồng với Book1.xls trong một table cần import, vd Table1 khai ở trên."Khi bạn xuất từ Excel, chọn vùng ví dụ "A1: D22" sang Access, biên dịch sẽ xem mặc định cột A có tên là F1... tương tự cột D có tên field là F4Vậy bạn phải tạo trên table1 các field F1 -> F4 để tương đồng với BooK1Để khai tên field trong Excel, đó là vị trí của Row1. Ví dụ A1 = "STT", B1 = "Họ và Tên", C1 = "Tuổi", D1 = "Ngày sinh" ...

b- Access qua Excel

MÃ: CHỌN TẤT CẢ

Private Sub Access2Excel2(AccessPath$, ExcelPath$)Const acExport = 1: Const

acSpreadsheetTypeExcel9 = 8Set objAccess =

CreateObject("Access.Application")objAccess.OpenCurrentDatabase AccessPath$  ' Câu

sau có Test là tên TableobjAccess.DoCmd.TransferSpreadsheet acExport,

acSpreadsheetTypeExcel9, "Test", ExcelPath$, TrueEnd Sub

Sử dụng:

MÃ: CHỌN TẤT CẢ

Private Sub Form_Load()Call Access2Excel2("E:\win\desktop\new.mdb", "E:\win\desktop\

new.xls")End Sub

21

Page 22: adodb

Đương nhiên Tập tin Access trong đường dẫn phải có, còn đường dẫn Excel KHÔNG CÓ TẬP TIN để function tạo MỚI!

gửi bởi NoBi vào ngày Thứ 2 09/06/2008 4:41 pm đối với file excel có nhiều sheet thì làm sao chọn được sheet cần export nhỉ?.

MÃ: CHỌN TẤT CẢ

objAccess.DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Test",

ExcelPath$, True, "Sheet2!"

gửi bởi dungcld75 vào ngày 8/11/2008 9:29 pm không rõ là mật khẩu khai báo như thế nào 

MÃ: CHỌN TẤT CẢ

objAccess.OpenCurrentDatabase AccessPath$, True, "dungcld75"

mà "dungcld75" là password

==================28- Truy xuất bản ghi thứ 20 trong database==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24773

Muốn làm việc này thì cách thông dụng nhất là bạn duyệt từ đầu đến bản ghi thứ 20 rùi lấy nó ra. Việc duyệt CSDL thì chắc bạn làm được. Bạn chỉ cần cho cái biến đếm cứ sau cái RS.MoveNext thì bạn lại tăng biến đếm. Khi biến đếm của bạn bằng 20 thì bạn chỉ việc select nó ra thôi, vì hiện giờ con trỏ CSDL đã trỏ tới bản ghi thứ 20 rùi.Chúc vui!

------------Nhanh nhất là dùng lệnh Recorset.Move

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adOpenStatic = 3: Const adLockOptimistic = 3

3. Set objConnection = CreateObject("ADODB.Connection")

4. Set objRecordset = CreateObject("ADODB.Recordset")

5. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source =

db1.mdb"

6. objRecordset.Open "SELECT * FROM table1", objConnection, adOpenStatic,

adLockOptimistic

7.  

8.     objRecordset.Move (0) ' cong thêm 0 dòng, tính tu` First -> dòng 1

9.     MsgBox objRecordset.fields("qqq")

10.     objRecordset.Move (1) ' cong thêm 1 dòng, tính tu` trên -> dòng 2

22

Page 23: adodb

11.     MsgBox objRecordset.fields("qqq")

12.     objRecordset.Move (5) '  cong thêm 5 dòng, tính tu` trên -> dòng 7

13.     MsgBox objRecordset.fields("qqq")

14.     objRecordset.Move (2) '  cong thêm 2 dòng, tính tu` trên -> dòng 9

15.     MsgBox objRecordset.fields("qqq")

16.     objRecordset.Move (-3) '  tru` Ði 3 dòng, tính tu` trên -> dòng 6

17.     MsgBox objRecordset.fields("qqq") & vbTab & objRecordset.fields("www")

18. End Sub

==================29- Câu lệnh SQL trong vb==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24894

Còn chèn thêm đk Where thì chạy sai:

MÃ: CHỌN TẤT CẢ

1. Set rc = dc.Execute("select SACH.TEN_SACH from SACH where SACH.SO_LUONG=0")

2. Set Adodc1.Recordset = rc

3. DataGrid1.Refresh

gửi bởi hoangthu1974 vào ngày Thứ 6 13/06/2008 10:40 pm Sửa lại một chút là:

MÃ: CHỌN TẤT CẢ

1. Set rc = dc.Execute("select SACH.TEN_SACH, SACH.SO_LUONG from SACH where

SACH.SO_LUONG=0")

2. Set Adodc1.Recordset = rc

3. DataGrid1.Refresh

Chú ý: Câu lệnh điều kiện WHERE... phải được select.--------Hoặc viết, nếu database đơn giản:

MÃ: CHỌN TẤT CẢ

1. Set rc = dc.Execute("select * from SACH where SACH.SO_LUONG=0")

==================30- Datagrid dùng các câu lệnh kết nối==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24896

xin hỏi các bạn 1 câu, mình muốn dùng datagrid để hiển thị dữ liệu nhưng không dùng ADODC mà dùng các câu lệnh để hiển thị sao cho khi thêm ,sửa xóa thì dữ liệu đều được cập nhật vào

23

Page 24: adodb

datagrid.xin hỏi cách làm.

Vấn đề Kết nối DataGrid1 với ADODB có nhiều câu trả lời trên các trang web chưa tường minhA- Kết nối DataGrid1a- Khai báo các kết nối:

MÃ: CHỌN TẤT CẢ

1. Dim objConnection As New ADODB.Connection

2. Dim objRecordSet As New ADODB.Recordset

b- Mở tập tin mdb

MÃ: CHỌN TẤT CẢ

1. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source =

db1.mdb"

c- Khai báo các hằng. Quan trọng à nha, không có thì Datagrid1 không hiển thị

MÃ: CHỌN TẤT CẢ

1. Const adLockOptimistic = 3: Const adOpenDynamic = 2: Const adUseClient = 3

2. objRecordSet.CursorLocation = adUseClient

d- Truy xuất bảng tin

MÃ: CHỌN TẤT CẢ

1. objRecordSet.Open "SELECT * FROM table1", objConnection, adOpenDynamic,

adLockOptimistic

e- Nối dataGrid1

MÃ: CHỌN TẤT CẢ

1. Set DataGrid1.DataSource = objRecordSet

B- Xóa record tại vị trí con trỏ trên DataGrid1

MÃ: CHỌN TẤT CẢ

1. objRecordSet.Delete

2. objRecordSet.MoveNext

C- Thêm record cuối recorset

MÃ: CHỌN TẤT CẢ

24

Page 25: adodb

1. objRecordSet.AddNew

2. objRecordSet("qqq") = 25

3. objRecordSet("www") = 218

4. objRecordSet.Update

D- Sửa record tại vị trí con trỏ

MÃ: CHỌN TẤT CẢ

1. objRecordSet("qqq") = 25

2. objRecordSet("www") = 218

3. objRecordSet.Update

==================31- Lỗi kết nối CSDL Access==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p24897

MÃ: CHỌN TẤT CẢ

1. gConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;" & _

2. "DataSource=" & App.Path & "\Data\data.mdb; " & _

3. "Persist Security Info=False"

nhưng khi chạy thông báo lỗi là "Could not find installable ISAM"

==================32- Xử lý lỗi==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p25068

MÃ: CHỌN TẤT CẢ

1. '------Ket Noi CSDL-------

2. Public Sub OpenDB(str As String)

3. On Error GoTo loi

4. '. . . . . .

5. cn.Open

6. loi:

7. MsgBox "KÕt Nèi DL Sai!" & vbCrLf & "H·y KiÓm Tra L¹i"

8. End Sub

gửi bởi thuat vào ngày Thứ 2 23/06/2008 5:54 am Viết như bạn thì Msgbox luôn xuất hiện mặc dù không có lỗi phát sinh.Bạn sửa lại như sau:

MÃ: CHỌN TẤT CẢ

25

Page 26: adodb

1. '------Ket Noi CSDL-------

2. Public Sub OpenDB(str As String)

3. On Error GoTo loi

4. ' . . . . . .

5. cn.Open

6. loi:

7. If Err Then

8. MsgBox "KÕt Nèi DL Sai!" & vbCrLf & "H·y KiÓm Tra L¹i"

9. Err.clear

10. End If

11. End Sub

- - - - Hoặc gọn hơn:

MÃ: CHỌN TẤT CẢ

1. '------Ket Noi CSDL-------

2. Public Sub OpenDB(str As String)

3. On Error GoTo loi

4. ' . . . . . .

5. cn.Open

6. Exit Sub '<--Phai thoát ra nêu không lôi

7. loi:

8. MsgBox "KÕt Nèi DL Sai!" & vbCrLf & "H·y KiÓm Tra L¹i"

9. End Sub

==================33- Lỗi gọi hàm trong thư viện==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p25069

Giả sử như có kết nối kiểu này

MÃ: CHỌN TẤT CẢ

1. Public Sub OpenDB(Querry_String As String)

2.  Dim fname As String

3.     fname = GetAppPath & "\Database\QLVT.mdb"

4.     Set Cn = fCreateObject("ADODB.Connection")

5.     Set Rs = fCreateObject("ADODB.Recordset")

6.     ' . . . . .

7. End Sub

Theo kiểu kết nối này thì em gọi thủ tục dũ liệu là :openDB"select *from..."nhưng đến khi thực hiện addnew thì vẫn báo lỗi.- - - - -

26

Page 27: adodb

Các biến, ta có thể đặt tên tùy thích, (tốt nhất là gợi nhớ) ví dụ trong code trên:

MÃ: CHỌN TẤT CẢ

1. Dim fname As String

Nhưng gọi hàm trong thư viện thì tên hàm phải chính xác. Với câu:

MÃ: CHỌN TẤT CẢ

1. Set Cn = fCreateObject("ADODB.Connection")

Khi chạy đã báo lỗi: Sub or Function not definedvì khi compile, không thể tìm trong các thư viện có hàm fCreateObject (hoặc là bạn chưa định nghĩa chúng). . . thì làm sao mà VB6 biên dịch được để ... "nhưng đến khi thực hiện addnew thì vẫn báo lỗi." ?Hàm CreateObject là một hàm thông dụng của VBA   mà nhiều người cứ ngỡ là VBS nên ngại dùng..Cú pháp: CreateObject(class as string,[Server name as string])nếu viết: Set Rs = CreateObject("ADODB.Recordset") là hoàn toàn đúng với ADODB là thư viện, Recordset là lớp. Riêng Server name bỏ qua

==================34- Hỏi cách xem cấu trúc của database SQL trong VBhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p25070

Liệt kê tên Tables và tên Fields trong file Access

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. ' Hai hang sô thông kê tên Table và tên Column

3. Const adSchemaTables = 20: Const adSchemaColumns = 4: Dim a$, i%

4. Dim objConnection As New ADODB.Connection: Dim objRecordset As New ADODB.Record

set

5.  

6. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source =" &

App.Path &"\db1.mdb"

7.  

8. Set objRecordset = objConnection.OpenSchema(adSchemaTables)

9. i = 1

10. Do Until objRecordset.EOF

11.     strTableName = objRecordset("Table_Name")

12.     Set objFieldSchema = objConnection.OpenSchema(adSchemaColumns, Array(Null,

Null, strTableName))

13.         If i > 6 Then  '<-- Gat bo temp tables

14.             a = a & vbCr & "Table: " & UCase(objRecordset("Table_Name")) & vbCr

15.                 Do While Not objFieldSchema.EOF

27

Page 28: adodb

16.                     a = a & objFieldSchema("Column_Name") & ", " &

objFieldSchema("Data_Type") & vbCr

17.                     objFieldSchema.MoveNext

18.                 Loop

19.         End If

20.     objRecordset.MoveNext

21.     i = i + 1

22. Loop

23. MsgBox a

24. End Sub

==================Bài viết anh HoangThu1974 về Add ActiveX==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p25093Khi chạy đã báo lỗi: Sub or Function not definedvì khi compile, không thể tìm trong các thư viện có hàm fCreateObject (hoặc là bạn chưa định nghĩa chúng). . . thì làm sao mà VB6 biên dịch được để ... "nhưng đến khi thực hiện addnew thì vẫn báo lỗi." ?Hàm CreateObject là một hàm thông dụng của VBA mà nhiều người cứ ngỡ là VBS nên ngại dùng..Cú pháp: CreateObject(class as string,[Server name as string])nếu viết: Set Rs = CreateObject("ADODB.Recordset") là hoàn toàn đúng với ADODB là thư viện, Recordset là lớp. Riêng Server name bỏ qua

Sử dụng CreateObject đồng nghĩa với việc phải khai báo lại một loạt các tham biến của ADODB.Nếu sử dụng cái này viết quen trên ADODB 2.5 thì 2.8 vẫn chạy được. Nhưng nếu viết trên 2.8 mà đem qua máy chỉ có ADODB 2.5 thì một số chức năng sẽ chạy không như ý của bạn.Việc sử dụng CreateObject khiến cho việc đem qua máy khách sử dụng được dễ dàng hơn, nhưng chương trình đóng gói sẽ không tìm thấy ADODB mà người lập trình đã sử dụng.Tốt nhất nên Reference cho nó và khai báo tường minh: Dim cn as ADODB.Connection, bạn sẽ có được các tham chiếu của ADODB.Connection hoặc ADODB.Recordset. Cách khai báo này dễ dùng hơn khi thao tác lập trình với code.Sau khi chạy ổn, có thể dùng lệnh Replace All để thay thế hết các khai báo này.

==================35- Hỏi cách đọc CSDL master trong SQL==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=20#p25141

Mình muốn hỏi cách đọc CSDL master trong SQL server để có thể hiện lên tên của tất cả các co so du liệu. AI biết vui lòng chỉ giùm..! thank!

MÃ: CHỌN TẤT CẢ

1. Dim Con As New ADODB.Connection

2. Dim Rec As New ADODB.Recordset

3. 'strComputer = "TênMáyChu" hoac

4. strComputer = "."

5. Con.Open "Provider=SQLOLEDB;Data Source=" & strComputer & ";" & _

6.         "Trusted_Connection=Yes;Initial Catalog=Master"

28

Page 29: adodb

7.  

8. Set Rec = Con.Execute("Select Name From SysDatabases")

9.  

10. If Rec.RecordCount = 0 Then

11.     MsgBox "No databases could be found."

12. Else

13.     Do Until Rec.EOF

14.         a = a & Rec.Fields("Name") & vbCr

15.         Rec.MoveNext

16.     Loop

17. End If

18. MsgBox a

Lưu ý: Đoạn code trên không biết hiệu quả thế nào vì bạn Caramen không có ý kiến phản hồi.Riêng trên máy của tôi: không có CSDL máy chủ, nhận được:Run-time error '-2147467259 (80004005)':[DBNETLIB][ConnectionOpen (Connect().]SQL Server does not exist or access denied.

==================36- Dùng lệnh Find với nhiều điều kiện==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25189

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Dim con As New ADODB.Connection

3. Dim rec As New ADODB.Recordset

4. Const adOpenStatic = 3: Const adLockOptimistic = 3

5.  con.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = db1.mdb"

6. rec.Open "SELECT * FROM bangma", con, adOpenStatic, adLockOptimistic

7. Multi_Find rec, "tenhocsinh = 'nguyen van a' AND tuoi = 15" '<-- Cách gọi Sub

Multi_Find

8. End Sub

9.  

10. Private Sub Multi_Find(ByRef oRs As ADODB.Recordset, sCriteria As String)

11. Dim clone_rs As ADODB.Recordset

12.       Set clone_rs = oRs.Clone

13.       clone_rs.Filter = sCriteria

14.       If clone_rs.EOF Or clone_rs.BOF Then

15.        oRs.MoveLast

16.        oRs.MoveNext

17.       Else

18.        MsgBox sCriteria & vbLf & " Ðã tìm ra!"

19.        oRs.Bookmark = clone_rs.Bookmark

20.       End If

21.       clone_rs.Close

22.       Set clone_rs = Nothing

29

Page 30: adodb

23. End Sub

Tôi định viết cái Function sCriteria(...) As String ... giúp bọn trẻ, nhưng thôi, nghĩ lại anhtuyenbk nói có lý, dùng các câu truy vấn "đã" hơn

==================37- Kỹ thuật truy xuất nhanh CSDL==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25212Các lệnh tìm thông thường tùy người viết: quen dạng code nào, tuy nhiên có một điểm cần nhấn mạnh nếu áp dụng đúng kỹ thuật lập trình thì sản phẩm sẽ tối ưu; ở đây tôi muốn nói đến việc:- Nếu kết quả là liệt kê với nhiều giá trị, phải sử dụng vòng lặp.- Nếu kết quả chỉ là một record, nên dùng các phương thức hay thuộc tính thích hợp để cho kết quả liền.

vd1: (Đã minh họa ở các bài trên)Tìm học sinh có tên "Nguyễn văn A" thì lệnh Find thích hợp, cho kết quả nhanh nhấtTìm học sinh có họ "Nguyễn" rõ ràng phải dùng vòng lặpSuy ra rằng lệnh Find (tìm một record) với code nhiều điều kiện vẫn nhanh hơn các câu truy vấn nhiều điều kiện trong một database to lớn.

vd2: (Đã minh họa)Khi mở chương trình, hãy đưa ngay con trỏ đến vị trí record thứ 20 trên Datagrid1Dùng lệnh Move, tránh dùng vòng lặp

vd3: (Đã minh họa)Truy xuất record thứ nnhư ví dụ 2

vd4: (Đã minh họa)Có bao nhiêu record trong tableDùng thuộc tính .RecordCount cho kết quả tức thì

và còn nhiều lệnh giúp truy xuất nhanh nữa, vd GetRows mà tôi đang đọc...

==================38- Hiển thị nhanh 5 dòng đầu của table ngay khi kết nốihttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25259

Thông thường khi duyệt tuần tự recorset, muốn hiển thị nhiều giá trị trong các field khác nhau, viết code có hơi mất công một tí. Trong một table có nhiều Field, tên Field lại khó viết... thì hiển thị cả dòng Recorset hơi bị rắc rối.ADODB cung cấp cho ta lệnh GetRows để đơn giản hóa việc nầy, khỏi duyệt Recordset mất công.Code sau đây sẽ hiển thị nhanh 5 dòng đầu của table Table1 (nhiều Fields) trong file db1.mdb cùng folder

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Dim Con As New ADODB.Connection:  Dim Rec As New ADODB.Recordset

3. Dim Mang As Variant, txt$, r%, c%

4.  

5. Con.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source = db1.mdb"

6. Rec.Open "SELECT * FROM table1", Con, adOpenStatic, adLockOptimistic

7. Mang = Rec.GetRows(5, 1)

30

Page 31: adodb

8. ' biên Ðâu: -1 = toàn bô record, hoac chi Ðinh sô record, vd 5 o' trên

9. ' biên sau: 0 = current record, 1 = first record, 2 = last record

10. Rec.Close: Con.Close

11.  

12. For r = LBound(Mang, 2) To UBound(Mang, 2)

13.         For c = LBound(Mang, 1) To UBound(Mang, 1)

14.             txt = txt & "| " & Mang(c, r) & vbTab

15.         Next c

16.         txt = Left$(txt, Len(txt) - 1) & vbCrLf

17.     Next r

18. MsgBox txt

19.  

20. End Sub

==================39- Điều chỉnh độ rộng cột dữ liệu trong MsFlexGrid và tạo màu khác nhau cho các dòng dữ liệu http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25265

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Data1.Refresh

3. Dim a&

4. Data1.Recordset.MoveFirst

5. Do While Not Data1.Recordset.EOF

6. If a < Len(Data1.Recordset.Fields("rrr").Value) Then a

=Len(Data1.Recordset.Fields("rrr").Value) Else a = a

7. Data1.Recordset.MoveNext

8. Loop

9. MSFlexGrid1.ColWidth(4) = a * 74 ' <--Ðã canh vu`a

10. End Sub

gửi bởi Kasper vào ngày Thứ 5 06/11/2008 11:38 am ta set trước BackColor = màu thứ nhất. Khi đó hàm SetColor viết lại như sau:

MÃ: CHỌN TẤT CẢ

1. Public Sub SetColor(ByVal Grid As MSFlexGrid)

2.     Dim i, j As Integer

3.    

4.     For i = 0 To Grid.Rows - 1

5.         Grid.Row = i

6.         For j = 0 To Grid.Cols - 1

31

Page 32: adodb

7.             Grid.Col = j

8.             If i Mod 2 Then

9.                 Grid.CellBackColor = màu thứ 2 ' &HC0E0FF

10.             End If

11.         Next

12.     Next

13. End Sub

Sử dụng: 

MÃ: CHỌN TẤT CẢ

1. SetColor MSFlexGrid1

==================40- Giải thích dùm câu báo lỗi này trong VB: Parameters Xephang has no default valid.http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25321nghĩa là "Thông số cột Xephang không có giá trị mặc định"Giải thích:VB6 thường dị ứng với giá trị nulldo đó khi tạo file mdb, bạn nên cho trị mặc địnhvd field có định dạng numberthì cho giá trị mặc định ( = bỏ qua không nhập vào) = 0Vì bạn không cho giá trị default của Xephang nên row = null--> gây lỗi

==================41- Thu nhỏ tập tin MDB==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25358

File Access của em sau khi ghi vào lên đến mấy chục MB, em xóa hết dữ liệu trong đó, nó vẫn còn mấy chục MB. Thế là thế nào nhỉ.Làm sao cho dung lượng giảm xuống các bác nhỉ!

MÃ: CHỌN TẤT CẢ

1. Dim objAccess As New Access.Application

2. Dim Test As Variant

3. ' Bao Ðam không có tâp tin db1.mdb tai ô Ðia C

4. Test = objAccess.CompactRepair(App.Path & "\db1.mdb", "c:\db1.mdb")

==================42- Lỗi Update CSDL. Xem thêm để rút kinh nghiệmhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25379

MÃ: CHỌN TẤT CẢ

1. Dim cn As ADODB.Connection

2. Dim strSQL As String

3. Dim re As ADODB.Recordset

32

Page 33: adodb

4.  

5. Private Sub Form_Load()

6.    Set cn = New ADODB.Connection

7.    cn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" &

App.Path &"\sinhvien.mdb"

8.     cn.Open

9. End Sub

10. Private Sub Command1_Click()

11.     Set re = New ADODB.Recordset

12.     re.Open "sinhvien", cn, adOpenStatic, adLockBatchOptimistic

13.     re.AddNew

14.     re!masv = txtmasv

15.     re!ten = txtten

16.     re!khoa = txtkhoa

17.     re.Update

18. End Sub

- - - - - gửi bởi TTD vào ngày Thứ 3 12/08/2008 11:20 pm Nên sử dụng đồng bộ:

MÃ: CHỌN TẤT CẢ

1. re.Open "sinhvien", cn, adOpenStatic, adLockOptimistic '<---

2. ...

3. re.Update '<---

Phương thức Recordset.Update đi kèm hằng số adLockOptimisticPhương thức Recordset.UpdateBatch đi kèm hằng số adLockBatchOptimistic

- - - - - gửi bởi vanthuy vào ngày Thứ 5 14/08/2008 9:54 am Bạn vào phần design của form sửa lại name của text masv thành txtmasv <---đặt tên 1 đường lại đi gọi 1 nẻo 

MÃ: CHỌN TẤT CẢ

1. re!masv = txtmasv '<---

==================43- TextBox thể hiện giá trị record khi click vào 1 hàng của dataGrid http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25380

Có cách nào, mình click chuột vào 1 hàng của dataGrid thì hàng đó hiện lên text box chẳng hạn ko?- - - - - - - -

33

Page 34: adodb

Nếu dùng ADODCKhai text1.Datasource là Adodc1khai text1.DataField là qqq chẳng hạn, qqq là field trong table1 mà Adodc1 nối kếtthì đương nhiên khi click vào một ô trên dòng bất kỳ của Datagrid1, text1 sẽ thể hiện giá trị của field qqq tại dòng đó

nếu dùng ADODB tôi chưa biết cáchbáo lỗi ngay khi khai: Text1.DataSource...

gửi bởi thuytrang2542000 vào ngày 9/11/2008 10:31 pm bác thử cái này xem 

MÃ: CHỌN TẤT CẢ

1. 'Text1 sẽ thể hiện giá trị của field qqq

2. Set Text1.DataSource = recordset

3. Text1.DataMember=""

4. Text1.DataField="qqq"

==================44- Chọn n bản ghi cuối Danh sách không sắp xếp!==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25381

Khi truy vấn dữ liệu, nếu ta không chọn sắp xếp theo một trường nào đó thì bộ máy cơ sở dữ liệu sẽ chọn trường khóa để sắp xếp, có nghĩa là luôn có sự sắp xếp các bản ghi . Còn những khả năng khác mình chưa thử.

- - - - - - -

MÃ: CHỌN TẤT CẢ

1. Private Sub Command2_Click() ' lây 5 bottom không sa'p xêp

2. Rec.Open "Select * From table1", Con, adOpenStatic, adLockOptimistic

3. For i = 1 To Rec.RecordCount

4. If i > Rec.RecordCount - 5 Then MsgBox Rec.Fields("qqq").Value

5. Rec.MoveNext

6. Next

7. End Sub

==================45- Tự động thêm, xoá dòng trong CSDL==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25405

mình có 1 bảng dữ liệu chỉ cho có 60 dòng(2 tháng, 1 dòng một ngày). làm sao để khi qua ngày mới(căn cứ vào ngày hệ thống) sẽ tự động thêm 1 dòng ngày mới nhất, và xoá đi một dòng củ nhất.ví dụ: ngày 15 tháng 4 thì trong csdl gồm từ ngày 15 tháng 3 -> 15 tháng 5ngày 16 tháng 4: thì trong csdl gồm từ ngày 16 tháng 3 -> 16 tháng 5( xoá ngày 15 tháng 3, thêm 16 tháng 5).Mong các bạn chỉ giúp. code hay ý tưởng cũng cảm ơn

34

Page 35: adodb

-------Code sau đây tự động xóa các ngày quá Một Tuần (2 tháng thì viết csdl nhiều quá) và tự động thêm chỉ một dòng mới hôm nay. Tặng buithiha vì chưa có câu trả lời cụ thể

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Dim Con As New ADODB.Connection:  Dim Rec As New ADODB.Recordset

3. Dim Ngay As Boolean, aa As Date: aa = Format(Now, "m/d/yyyy")

4.  

5. Con.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source = db1.mdb"

6. Rec.Open "SELECT ngaythang FROM table1", Con, adOpenStatic, adLockOptimistic

7. Rec.MoveFirst

8. Do While Not Rec.EOF

9. If Rec.Fields("ngaythang").Value = aa Then Ngay = True

10. If (Rec.Fields("ngaythang").Value + 7) < aa Then Rec.Delete

11. Rec.MoveNext

12. Loop

13. If Ngay = False Then

14. Rec.AddNew

15. Rec("ngaythang") = aa

16. Rec.Update

17. End If

18. End Sub

==================46- Phân tích câu lệnh trong kết nối và truy xuất dữ liệuhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=40#p25424Đây như là bài tập minh họa, nhờ các anh đi trước chỉ thêm

gửi bởi nnlong159 vào ngày Thứ 6 02/05/2008 8:30 pm ...các bạn giải thích thì ghi rõ ràng và giải thích nữa nhé...cảm ơn các bạn rất nhiều

- - - - - -gửi bởi vietteiv vào ngày Chủ nhật 04/05/2008 8:35 pm 

nnlong159 đã viết:

MÃ: CHỌN TẤT CẢ

1. Private Sub txt_MaPhong_Change()

2.      If cn.State = 1 Then

3.         cn.Close '<--- tại sao phải kiểm tra và ngắt kết nối ở đây.

sao ko làm cuối mỗi lần kết nối xong

4.     End If

5.     Call KetNoi("\db_qlks.mdb")

6.     Dim sql As String

35

Page 36: adodb

7.     sql = "select * from Phong"

8.     Rs.Open sql, cn, adOpenKeyset, adLockOptimistic '<--- mục đích

chỗ này bạn làm cái gì thế

9.     sql = "Select * From [Phong] Where [MaPh]='" &

txt_MaPhong.Text & "'""" '<---câu lệnh này sai, dư cặp nháy "".

khai báo câu sql nhưng ko cho kết nối thì lấy gì mà chạy

10.     txt_GiaPH.Text = Rs.Fields("Gia") '<--- thực chất kết quả

của field Giá là từ kết nối này sql = "select * from Phong"

11.     cn.Close

12.     Call KetNoi("\db_qlks.mdb") '<--- mắc cái gì mà cứ kết nối

hoài thế, làm cho chương trình chậm thêm

13.     Dim sSQL As String '<--- khai báo thêm 1 biến nữa để làm

gì, sao ko sử dụng luôn cái sql ở trên

14.     sSQL = "select * from KhachHang"

15.     Rs.Open sSQL, cn, adOpenKeyset, adLockOptimistic '<--- lại

nữa, không hiểu bạn muốn xuất cái gì ra đây   :-O

16. End Sub

viết lại như thế này:

MÃ: CHỌN TẤT CẢ

1. Private Sub txt_MaPhong_Change()

2.     sql = "Select * From [Phong] Where [MaPh]='" & txt_MaPhong.Text & "'"

3.     Rs.Open sql, cn, adOpenKeyset, adLockOptimistic

4.     If Rs.RecordCount > 0 Then

5.        txt_GiaPH.Text = Rs.Fields("Gia")

6.     Else

7.        txt_GiaPH.Text = 0 ' hoặc hiện câu thông báo ko có giá cũng được, tùy

bạn

8.     End If

9.     Set Rs=Nothing

10. End Sub

- - - - -Ghi chú: Các hằng như adOpenKeyset, adLockOptimistic hình như khi dùng chả cần khai báo là nó bằng mấy. Cứ viết thế là chạy tốt và máy hiểu ngay đó là:

MÃ: CHỌN TẤT CẢ

1. Rs.Open sql, cn, 1, 3

36

Page 37: adodb

==================47- Bắc buộc dùng sau câu truy vấn "SELECT...": Do While not Recordset.EOF?http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p25493

MÃ: CHỌN TẤT CẢ

1. for i=1 to rs.recordcount

2.   ' code xử lý record hiện tại

3.   ...

4.   rs.movenext ' chạy đến mẫu tin tiếp theo

5. next i

ủa cấu trúc mình viết như vậy có sai chỗ nào ko hoangthu1974

Cấu trúc thì không!Nhưng kiểm tra thì phải kiểm tra trong DB

MÃ: CHỌN TẤT CẢ

1. while not rs.eof then

2.  

3. rs.movenext

Chứ ai kiểm tra trong recordcountNhư thế thì bó tay!

gửi bởi vietteiv vào ngày Thứ 3 21/10/2008 4:33 pm 

vietteiv đã viết:sặc, theo như bạn hiểu thì câu lệnh for ... next theo recordcount khác với while not phải ko hihi nói thật mình ko thích dùng while not, giống sách vở quá. tùy cách dùng của mỗi coder, quan trọng là bạn có theo dõi và kiểm soát được lỗi với code bạn viết hay ko thôi. chứ ko phải sử dụng rs.eof là có kiểm tra trong DB gì gì như bạn nghĩ đâu

- - - - - - - - - Bàn thêm cho rõ:Khi biên dịch đến câu: ObjConnection.Open thì phần mềm tiến hành mở một Database cụ thể, (tựa như khi ta click double vào tập tin MDB vậy, ta sẽ thấy có bao nhiêu table trong file hiện ra, và chỉ thế thôi); có nghĩa là ObjConnection mới quản lý sơ bộ tên các Tables và thậm chí sơ bộ tên các Fields. Tuy nhiên ta vẫn chưa lấy được các thông tin nầy = 'ObjConnection.OpenSchema(...)'

Khi biên dịch đến câu: ObjRecordset.Open "Select .. (tựa như ta clicl double vào một table nào đó) thì ObjRecordset mới đọc hết nội dung theo câu truy vấn; tôi nhấn mạnh, chỉ với một câu: Recordset.Open "Select .. thì ObjRecordset đã đọc hết nội dung theo câu truy vấn trong Tablea- ObjRecordset.Open "SELECT * FROM Table1", ObjConnection, adOpenStatic, adLockOptimistic thì ObjRecorset đã có hết thông tin toàn bộ của Table1, mỗi Recordset là một dòng chứa các giá trị của tất cả các Fields trong Table1

37

Page 38: adodb

b- ObjRecordset.Open "SELECT qqq FROM Table1", ObjConnection, adOpenStatic, adLockOptimistic thì ObjRecorset đã có hết thông tin toàn bộ của field 'qqq', mỗi Recordset là một dòng chứa 1 giá trị của Fields 'qqq'c- objRecordSet.Open "SELECT * FROM Table1 WHERE " & ". . .", . . .thì ObjRecorset đã có hết thông tin toàn bộ của Table1 THEO ĐIỀU KIỆN, mỗi Recordset là một dòng chứa các giá trị của tất cả các Fields trong Table1 THEO ĐIỀU KIỆN đã yêu cầu.

Ngang đây, ta có thể truy xuất các thông tin đơn giản cực nhanh. Các ví dụ đã minh họa ở các bài trước như: Find, Move, ObjRecordset..RecordCount, GetRows...

Với khối lượng thông tin đồ sộ đã có chứa trong ObjRecordset, ta làm sao truy xuất các thông tin phức tạp cần biết? buộc phải dùng vòng lặp!

Và thế thì đến đây bạn sẽ công nhận là dùng vòng lặp nào (để duyệt từng Recordset)cũng thế thôi:

MÃ: CHỌN TẤT CẢ

1. Do While Not objRecordSet.EOF

2. . . .

3. Loop

cũng tương đương

MÃ: CHỌN TẤT CẢ

1. For i = 1 to objRecordSet.RecordCount

2.  . . .

3. next

cũng tương đương

MÃ: CHỌN TẤT CẢ

1. While Not objRecordset.EOF

2. . . .

3. Wend

* Với mục đích để duyệt từng Recordset, theo ý của anh hoangthu1974 thì While . . . Wend là mạnh hơn cả.* Để làm chuyện khác nào đó thì theo tôi, For . . . Next lại tốt nhất, thực hiện điều mà hai phép lặp còn lại không làm được. Ví dụ: Xem mục 44- Chọn n bản ghi cuối Danh sách không sắp xếp!

==================48- Tài liệu học tập bằng tiếng Việt: Đối tượng dữ liệu ActiveXhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p25579Module by: KS. Lâm Hoài Bảo Summary: Mục tiêu: Chương này giới thiệu về thư viện ActiveX Data Object (ADO), thư viện đối tượng được sử dụng nhiều nhất trong các ứng dụng truy cập cơ sở dữ liệu dạng khách/chủ (Client/Server) hiện nay.

38

Page 39: adodb

Học xong chương này, sinh viên phải nắm bắt được các vấn đề sau:- Kiến trúc OLEDB/ADO.- Cây phân cấp của mô hình đối tượng ADO.- Sử dụng thư viện đối tượng ADO để tương tác với cơ sở dữ liệu trong VB.Kiến thức có liên quan:- Các cấu trúc lập trình trong VB.- Câu lệnh truy vấn dữ liệu trong cơ sở dữ liệu.- Nắm bắt được các mô hình DAO, RDO là một lợi thế vì lúc đó việc tiếp thu mô hình ADO được nhanh hơn.Tài liệu tham khảo:- Microsoft Visual Basic 6.0 & Lập trình cơ sở dữ liệu - Chương 27, trang 877 - Nguyễn Thị Ngọc Mai (chủ biên) – Nhà xuất bản Giáo dục - 2000.- Tự học Lập trình cơ sở dữ liệu với Visual Basic 6 trong 21 ngày (T2) – Chương 18, trang 277 - Nguyễn Đình Tê (chủ biên) - Nhà xuất bản Giáo dục - 2001.ADO (ActiveX Data Objects) là công nghệ truy cập cơ sở dữ liệu hướng đối tượng tương tự như DAO. Hiện nay, ADO được Microsoft xem kỹ thuật chính để truy cập dữ liệu từ Web Server.http://caulacbovb.com/forum/download/file.php?id=3102

==================50- Định dạng khổ giấy của Report nằm ngang?==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p25683

Làm thế nào để định dạng khổ giấy A4 của Report nằm ngang. Mình tìm hoài chẳng ra, mong giúp đỡ 

gửi bởi phongvanvu vào ngày Thứ 7 05/01/2008 11:23 am http://www.microsoft.com/downloads/details.aspx?familyid=7b9ba261-7a9c-43e7-9117-f673077ffb3c&displaylang=enDown cái này về cài thêm rồi dùng lệnh:

MÃ: CHỌN TẤT CẢ

1. DR.Orientation = rptOrientLandscape

là đượcDR là DataReport còn câu lệnh đó là để xoay tờ giấy nằm ngang viết trong cửa sổ Code..

==================51- Truy vấn biến đổi Field==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p25751

sau đây là Code thông thường hiện lên Datagrid1 các Fields từ Table1:

MÃ: CHỌN TẤT CẢ

1. Dim Con As New ADODB.Connection: Dim Rec As New ADODB.Recordset

2. StrCon = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\

db1.mdb"

3. Rec.CursorLocation = adUseClient

4. Con.Open StrCon

5. Rec.Open "select * from table1", Con, adOpenDynamic, adLockOptimistic ' <-- Câu

nây Ðây!!

6. Set DataGrid1.DataSource = Rec

39

Page 40: adodb

Chả biết điều sau đây đã nói trong sách chưa (vì tôi không có sách), nhưng rõ ràng tôi đã tự tìm ra trưa nay! Nếu có, ghi lại cũng chả sao; mà chưa có thì thiệt là gê gớm!! (Nhờ các bạn thẩm định)

A- Tôi muốn hiện lên Datagrid1 tất cả các field, trong đó các giá trị của field 'www' đều được nhân với một số X = 18.5

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select *,www*18.5 from table1", Con, adOpenDynamic, adLockOptimistic

B - Tôi muốn hiện lên Datagrid1 chỉ một field, trong đó các giá trị của field 'www' đều được nhân với một số X = 22.25

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select www*22.25 from table1", Con, adOpenDynamic, adLockOptimistic

Ghi chú: phép chia thay bằng dấu / cọng + và trừ - ví dụ: trừ với một số X = 5.46

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select www - 5.46 from table1", Con, adOpenDynamic, adLockOptimistic

C- Tôi muốn hiện lên Datagrid1 tất cả các field, trong đó các giá trị của field 'rrr' đều được ghép thêm chuỗi = "by truongphu"

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select *,rrr & ' by truongphu' from table1", Con, adOpenDynamic,

adLockOptimistic

 

Tiếp tục

D- Tôi muốn hiện lên Datagrid1 chỉ một field, trong đó là các giá trị của field 'qqq' ghép với field 'www'

40

Page 41: adodb

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select qqq & www from table1", Con, adOpenDynamic, adLockOptimistic

E- Tôi muốn hiện lên Datagrid1 chỉ một field, trong đó là các giá trị của field 'qqq' CỌNG với field 'www'

MÃ: CHỌN TẤT CẢ

1. Rec.Open "select qqq + www from table1", Con, adOpenDynamic, adLockOptimistic

Các phép trừ, nhân, chia... tương tự

==================52- cách sử dụng câu truy vấn "select" khi chọn 1 date bất kỳ ?gửi bởi DQHung vào ngày Thứ 6 22/02/2008 3:26 pm tôi có 1 db access gồm 1 table có 2 field (date,sukien)Vậy dùng câu lệnh như thế nào để khi chọn 1 date bất kỳ thì sukien sẻ hiển thị theo date đó ?

gửi bởi thuat vào ngày Thứ 6 22/02/2008 8:00 pm 

Bạn viết câu lệnh đó như sau:

MÃ: CHỌN TẤT CẢ

1. "Select * From TableName Where date = #" & date & "#"

trong đó date là biến kiểu ngày tháng, ví dụ khi biến date = 22/02/2008 thì câu lệnh trên sẽ trả về tất cả các bản ghi có dữ liệu trong trường date là ngày 22/02/2008==================53- "Runtime 3021: error Either EOF and BOF is true,or current record has been deletedhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p25998

MÃ: CHỌN TẤT CẢ

1. truyvan = "select soluong from kho where TenSP ='" & TenSP & "' and NgayHetHan

= #" & NgayHetHan & "#"

vấn đề là đối với 1 số sản phẩm và ngày hết hạn(không phải tất cả) thì gặp lỗi "Runtime 3021: error Either EOF and BOF is true,or current record has been deleted.Requested operation requires a current record" và có vẻ như ko đưa ra được kêt quả nào (recordcount = 0)Khi dùng câu truy vấn này trong access thì lại ko có vấn đề gì cả, vẫn đưa ra được số lượng spvề csdl thì trong bảg này có 3 trường là tensp(PK),ngayhethan(PK),soluong

gửi bởi thuat vào ngày Thứ 5 31/01/2008 8:46 pm Để khắc phục lỗi này thì trước khi bạn thao tác với đối tượng Recordset bạn kiểm tra xem đối

41

Page 42: adodb

tượng Recordset có mẩu tin nào không, nếu không có mẩu tin nào thì bạn không nên thực hiện các thao tác như di chuyển, đọc các Fields từ Recordset. Ví dụ:

MÃ: CHỌN TẤT CẢ

1. adothongke.RecordSource = "Select * From Thietbi Where (Mavt = 'CPU') And

(Ngayban = #23/01/2008#)"

2. adothongke.Refresh

3. if adothongke.Recordset.Recordcount > 0 then

4. txttenthietbi.Text = adothongke.Recordset.Field("Tenthietbi")

5. end if

gửi bởi HangXom vào ngày Thứ 7 02/02/2008 11:40 am Nếu bạn muốn lấy chỉ những mặt hàng có hạn sử dụng thì sử dụng câu lệnh sau:

MÃ: CHỌN TẤT CẢ

1. truyvan = "select soluong from kho where TenSP ='" & TenSP & "' and NgayHetHan

= #" & NgayHetHan & "#" and NgayHetHan <> '' and not NgayHetHan  is null "

Còn nếu muốn lấy cả những mặt hàng không có ngày hết hạn sử dụng thì:

MÃ: CHỌN TẤT CẢ

1. truyvan = "select soluong from kho where TenSP ='" & TenSP & "' and NgayHetHan

= #" & NgayHetHan & "#" & " and NgayHetHan <> '' and not NgayHetHan  is null

union " & "select soluong from kho where TenSP ='" & TenSP & "'  and NgayHetHan

is null  "

==================54- Truy vấn nhiều Table==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26022"SELECT * FROM tbNhanVien INNER JOIN tbChucVu ON tbNhanVien.IDNV = tbChucVu.IDNV WHERE tbNhanVien.IDNV = 15", ...

==================55- Adodc1.Recordset.Filter không làm việc được==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26199

..dùng ADODC để kết nối data cái này thì đã ok .Nhưng còn cái tính năng tìm kiếm tìm dưới dạng "like " và cho một cái combo bên cạnh cho việc lựa chọn nếu chọn all thì hiển thị tất cả nếu text nhập vào rỗng thì hiển thị tất cả nếu khác rỗng thì lọc theo từ đánh vào. Code sau sao chưa được?

MÃ: CHỌN TẤT CẢ

1. Private Sub Text1_Change()

42

Page 43: adodb

2.     If Text1.Text = "" Then

3.         sfilter = ""

4.         Adodc1.Refresh

5.     Else

6.     Select Case Combo1.ListIndex

7.             Case 1

8.                 sfilter = "[makh] like '%" & Text1.Text & "%'"

9.             Case 2

10.                 sfilter = "[tenkh] like '%" & Text1.Text & "%'"

11.             Case 3

12.                 sfilter = "[diachi] like '%" & Text1.Text & "%'"

13.     End Select

14.                     Adodc1.Recordset.Filter = sfilter

15.                     Adodc1.Refresh

16.                     DataGrid1.Refresh

17.     End If

18. End Sub

- - - - - -Lệnh: Adodc1.Recordset.Filter = sfilter --> đúng, Adodc1.Recordset đã lọc tốt!

Nhưng khi bạn viết lệnh: Adodc1.Refresh, tức là bạn yêu cầu đối tượng Adodc1 (là cấp trên của Adodc1.Recordset) phải Refresh tức là Adodc1 tái tải kết nối, đó là lệnh

MÃ: CHỌN TẤT CẢ

1. Adodc1.RecordSource = "select * from khachhang"

mà bạn đã khai tại Form Load -->Do đó Datagrid1 chả thay đổi gì như hồi Form Load!

Khắc phục: Bỏ dòng lệnh thừa: Adodc1.Refresh

Để code gọn đẹp, có thể sửa lại như sau:

MÃ: CHỌN TẤT CẢ

1. Private Sub Text1_Change()

2.     If Text1.Text = "" Then

3.       Adodc1.Refresh  ' <-- Ðã goi Adodc1.Refresh thì không cân sfilter = ""

4.     Else

5.     Select Case Combo1.ListIndex

6.             Case 1

7.                 sfilter = "makh like '%" & Text1.Text & "%'"  ' <-- bo mây dâu

Ðóng

8.             Case 2

9.                 sfilter = "tenkh like '%" & Text1.Text & "%'"

43

Page 44: adodb

10.             Case 3

11.                 sfilter = "diachi like '%" & Text1.Text & "%'"

12.     End Select

13.                     Adodc1.Recordset.Filter = sfilter  ' <-- bo luôn

DataGrid1.Refresh và không cân khai sau Ðó sfilter = ""

14.     End If 

15. End Sub

==================56- DataGrid báo lỗi: Run-time error '7004' The Rowset is not bookmarkablehttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26208

MÃ: CHỌN TẤT CẢ

1. rs.Open "Select *from tblKhach", cnn, adOpenDynamic, adLockOptimistic,

adUserClient

2. ...

3. Set grdCustomers.DataSource = rs

nó báo lỗi vàng tại "Set grdCustomers.DataSource = rs"

- - - - -Đã trình bày ở mục 40 Sử dụng vài hằng trong mở file MDBCú pháp lệnh Open của Recordset là:RecordsetObject.Open Source, ActiveConnection, CursorType, LockType, Options

Trong câu lệnh 

MÃ: CHỌN TẤT CẢ

1. rs.Open "Select *from tblKhach", cnn, adOpenDynamic, adLockOptimistic,

adUserClient

thì cnn là ActiveConnectionadOpenDynamic là CursorTypeadLockOptimistic là LockTypeNHƯNG adUserClient thì không phải Options!Do đó khi biên dịch, VB6 không hiểu adUserClient tại vị trí nầy là gì, nó tự động bỏ qua, VB6 chỉ chạy một phần, đó là:

MÃ: CHỌN TẤT CẢ

1. rs.Open "Select *from tblKhach", cnn, adOpenDynamic, adLockOptimistic

Và khi bạn khai

MÃ: CHỌN TẤT CẢ

44

Page 45: adodb

1. Set grdCustomers.DataSource = rs

thì rs của bạn còn thiếu đặc tính adUserClient mà bạn đã nghĩ rằng đã khai rồi!Do đó sinh ra lỗi trênKhắc phục: Phải khai adUserClient theo cú pháp: objRecordset.CursorLocation = adUseClientmà cụ thể code của bạn như sau:

MÃ: CHỌN TẤT CẢ

1. rs.CursorLocation = adUseClient

2. rs.Open "Select *from tblKhach", cnn, adOpenDynamic, adLockOptimistic

3. ...

4. Set grdCustomers.DataSource = rs

là OK!

==================57- Tạo một Table tạm thời==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26313

Có nhiều câu hỏi về tạo một table tạm thời.Sau đây là code để tạo table tạm thời, có thể AddNew, Edit, Delete, UpDate...và truy xuất bình thường. Đương nhiên hết làm việc thì Table tạm thời sẽ tan biến

(Ghi chú: tôi mới đọc ADOR)   

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Const adVarChar = 200: Const MaxCharacters = 255: Const adFldIsNullable = 32

3. Dim adoRS As New ADOR.Recordset '<-- Tao môt Recordset tam tho`i = TempTable

4. adoRS.Fields.Append "So1", adBigInt '<-- Tao môt field 'So1'

5. adoRS.Fields.Append "Chuoi2", adVarChar, MaxCharacters, adFldIsNullable '<--

Tao môt field 'Chuoi2'

6. adoRS.Open

7.     For I = 10000000 To 10000005

8.         adoRS.AddNew

9.         adoRS("So1") = I ' Ghi sô vào field

10.         adoRS("Chuoi2") = (I - 8000000) & "N" & I ' Ghi chuôi vào field

11.     Next

12.     adoRS.Update

13.    

14. adoRS.MoveFirst

15.  

16. Do While Not adoRS.EOF

17.     MsgBox adoRS.Fields.Item("So1") & vbTab & adoRS.Fields.Item("Chuoi2")

18.     adoRS.MoveNext

19. Loop

45

Page 46: adodb

20. End Sub

==================58- Đánh số thứ tự trong DataReport==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26335

Hướng dẫn bởi: cucarot 20-6-2006 http://www.ddth.com/showthread.php?t=94050

gửi bởi luc_huong85 vào ngày Thứ 6 16/05/2008 10:53 amMình đang làm một báo cáo trong VB6.0 . Mình muốn đưa ra số thứ tự tự động . Vậy làm bằng cách nào ??

gửi bởi hoclaivb vào ngày Thứ 5 22/05/2008 11:32 am Nếu bạn làm trong datareport thì mình có làm rồi, cũng học hỏi lại người khác. xuất trường STT mà không cần phải có mặt nó trong database.

- - - - - - - Sau đây tôi cố nói chi tiết:1- Mở Project, Chọn DataReport1, chọn Design2- Click chuột phải vào Detail(Section1), chọn Insert Control, chọn TextBox, Sẽ hiện ra TextBox có chữ Unbound có tên mặc định là Text1, bố trí nó ở vị trí đầu tiên. Chọn Text1 nầy , ở phần Properties bên phải:- DataField gán cho một field bất kỳ, lúc ấy Text1 sẽ mang caption là tên field vừa gắn- DataFormat vào bảng .. chọn Number3- Chèn một label ở Page Header (Section2) cho Caption là "STT"4- Click Double vào Section1 để viết code. Dán vào đoạn code sau:

MÃ: CHỌN TẤT CẢ

1. Dim i As Integer ' thuytrang2542000 Ðã bô sung. thank to tt

2. Dim  WithEvents DisCountFormat As StdDataFormat

3. Private Sub DisCountFormat_Format(ByVal DataValue As StdFormat.StdDataValue)

4. i = i + 1

5. DataValue = i

6. End Sub

7.  

8. Private Sub DataReport_Initialize()

9. Set DisCountFormat = New StdDataFormat

10. Set Sections("Section1").Controls("Text1").DataFormat = DisCountFormat

11. End Sub

Hết! Chúc bạn thành công

==================59- Hiệu chỉnh các Records trong một Field==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26754

Mục 51- Truy vấn biến đổi Field thực ra là gọi một Field tạm: Field truy vấn có tên là Expr 1000 và Field nầy chuyển tải nội dung truy vấn.Nếu muốn biến đổi Field thật sự trong database, chúng ta phải dùng phương thức UPDATECode sau đây thêm số 1 vào đằng trước tất cả các record của Field 'www' (định dạng Number)

46

Page 47: adodb

trong Table1:

MÃ: CHỌN TẤT CẢ

1. Dim Con As New ADODB.Connection: Dim Rec As New ADODB.Recordset

2. StrCon = "provider=microsoft.jet.oledb.4.0;data source=" & App.Path & "\

db1.mdb"

3. Rec.CursorLocation = adUseClient

4. Con.Open StrCon

5. Rec.Open "UPDATE Table1 SET www = 1 & www ", Con, adOpenDynamic,

adLockOptimistic

6.  

7. Rec.Open "Select * From Table1", Con

8. Set DataGrid1.DataSource = Rec ' Dùng DataGrid Ðê kiêm tra thay Ðôi

Hoặc ta có thể thêm ở sau, hoặc cọng, trừ, nhân ...Nếu Field có định dạng Text, nhớ từ ghép nằm trong nháy đơn. ví dụ:

MÃ: CHỌN TẤT CẢ

1. Rec.Open "UPDATE Table1 SET eee = eee & 'bis'", Con, adOpenDynamic,

adLockOptimistic

==================60- Kết nối CSDL chỉ dùng Recordset, không dùng Connection! http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=60#p26762

Mục 57- Tạo một Table tạm thời có đề cập việc dùng thư viện ADOR. Đây là thư viện chuyên tạo Recordset, và ta chỉ việc dùng Recordset nầy làm việc trực tiếp trên CSDL mà không cần kết nối với ADODB.Connection. Tuy nhiên file Database chỉ có 2 định dạng thích hợp là ADGT (Const adPersistADGT = 0) và XML (Const adPersistXML = 1). Ở đây chúng ta dùng file XML vì đơn giản.

--> Nội dung Code Sub Form_Load() là mở tập tin MDB và lưu cùng thư mục với định dạng XML--> Qua Sub Command1_Click(), các biến đã khai báo không còn giá trị. Ta dùng ADOR.Recordset mới tạo để mở tập tin XML, tải lên Datagrid1

MÃ: CHỌN TẤT CẢ

1.  

2. Private Sub Form_Load()

3. Const adPersistXML = 1

4. Dim Con As New ADODB.Connection: Dim Rec As New ADODB.Recordset

5. Con.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & "Data Source= db1.mdb"

6. Rec.Open "Select * From Table1", Con

7. If Dir("Test.xml") <> Empty Then Kill "Test.xml"  ' Có thì xóa, tránh báo lôi

8. Rec.Save "Test.xml", adPersistXML

47

Page 48: adodb

9. End Sub

10.  

11. Private Sub Command1_Click()

12. Dim ADORec As New ADOR.Recordset ' <-- Không phai ADODB ngen!

13. ADORec.Open "Test.xml" ' <-- Rât Ðo'n gian

14. Set DataGrid1.DataSource = ADORec

15. End Sub

16.  

==================Bài viết xuanquy_th Set Control.DataSource==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27095

==================Bài viết thuytrang2542000 giải thích bài trên==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27113

==================61-Link các textbox với Recordset bằng code==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27119

Tôi xin viết lại như sau:- cần file db1.mdb cùng thư mục, có table là Table1 chứa các field 'qqq', 'www'...- vẽ 2 textbox có name là 'qqq' và 'www' (phải cùng tên với field muốn thể hiện)Code link các textbox với Recordset cụ thể như sau:

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. Dim Con As New ADODB.Connection: Dim Rec As New ADODB.Recordset

3. Con.Open "provider=microsoft.jet.oledb.4.0;data source=db1.mdb"

4. Rec.Open "select * from table1", Con, adOpenDynamic, adLockOptimistic

5. Call TextBoxLink(Form1, Rec)

6. End Sub

7. Public Sub TextBoxLink(frm As Object, rs As ADODB.Recordset)

8. Dim ctrl As Control

9. For Each ctrl In frm.Controls

10.     If TypeOf ctrl Is TextBox Then

11.           Set ctrl.DataSource = rs

12.           On Error GoTo Lôi

13.           ctrl.DataField = ctrl.Name

14.     End If

15. Next

16.     Exit Sub

48

Page 49: adodb

17. Lôi:

18. MsgBox "Tên TextBox không Ðúng vo'i tên Field"

19. End Sub

==================Bài viết của TTD hướng dẫn lập trình CSDL ==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27173

==================62- Xác định field nào là autonumber và field nào là (primary) keyhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27244

Dựa trên ADODB có Connection và Recordset, tôi đã cố viết nhưng không thành công, có lẽ do tôi chưa biết hay ADODB không hổ trợ!

Thôi thì các bạn chịu khó Add DAO vào

MÃ: CHỌN TẤT CẢ

1. ' Tôi Ðã test

2. Dim db As DAO.Database: Dim tbf As DAO.TableDef: Dim fld As DAO.Field: Dim idx 

As DAO.Index

3.     Set db = DBEngine.OpenDatabase("db1.mdb")  '<---------------------

4.     Set tbf = db.TableDefs("table1")  '<------------------------

5.    

6.     For Each fld In tbf.Fields

7.         If fld.Attributes And dbAutoIncrField Then

8.             MsgBox "Autoincrement field: " & fld.Name

9.         End If

10.     Next

11.    

12.     For Each idx In tbf.Indexes

13.         If idx.Primary Then

14.             For Each fld In idx.Fields

15.                 MsgBox "Primary key: " & fld.Name

16.             Next

17.         End If

18.     Next

19.     db.Close

20.     Set idx = Nothing:     Set fld = Nothing:     Set tbf = Nothing:     Set db

= Nothing

==================63- Sắp xếp cột ASC hay DESC và chọn TOP==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27272

49

Page 50: adodb

File db1.mdb cùng thư mục chứa table1 có field 'qqq', 'www', 'eee'...Form1 có Command1 và Datagrid1 để thể hiện hay so sánh

MÃ: CHỌN TẤT CẢ

1. Dim Con As New ADODB.Connection: Dim Rec As New ADODB.Recordset

2.  

3. Private Sub Form_Load()

4. Con.ConnectionString = "provider=microsoft.jet.oledb.4.0;data source=db1.mdb"

5. Rec.CursorLocation = adUseClient

6. Con.Open

7. Rec.Open "Select * from Table1", Con

8. Set DataGrid1.DataSource = Rec

9. End Sub

10.  

11. Private Sub Command1_Click()

12. MsgBox "Sau Ðây Datagrid sap xêp theo côt qqq duo'i lên (DESC)"

13. Rec.Close

14. Rec.Open "SELECT * FROM Table1 ORDER BY qqq DESC", Con

15. Set DataGrid1.DataSource = Rec

16.  

17. MsgBox "Sau Ðây là TOP 3 duo'i lên (DESC) côt www"

18. Rec.Close

19. Rec.Open "SELECT TOP 3 * FROM Table1 ORDER BY www DESC", Con

20. Set DataGrid1.DataSource = Rec

21.  

22. MsgBox "Sau Ðây là TOP 5 trên xuông (ASC)côt qqq"

23. Rec.Close

24. Rec.Open "SELECT TOP 5 * FROM Table1 ORDER BY qqq", Con

25. Set DataGrid1.DataSource = Rec

26.  

27. MsgBox "Sau Ðây là BOTTOM 3 không sa'p xêp côt qqq"

28. Rec.Close

29. Rec.Open "SELECT * FROM Table1", Con

30. Set DataGrid1.DataSource = Rec

31. For i = 1 To Rec.RecordCount

32. If i > Rec.RecordCount - 3 Then MsgBox Rec.Fields("qqq").Value

33. Rec.MoveNext

34. Next

35.  

36. End Sub

==================Bài viết xuanquy_th về Xác định field nào là autonumber và field nào là (primary) key

50

Page 51: adodb

http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27306

http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27313

==================63b- Function toàn vẹn tìm Primary Key và ID Autonumberhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=80#p27333

==================86- Khai báo, mở và đóng các kết nối==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=140#p29509

86- Khai báo, mở và đóng các kết nối

MÃ: CHỌN TẤT CẢ

1. Private Sub Form_Load()

2. ' A- Khai báo Tuo`ng Minh có Add References MS ActiveX Data Objects 2.8 Library

3. ' 1- Khai báo chuân classic:

4. Dim Con As ADODB.Connection

5. Set Con = New ADODB.Connection

6. ' 2- Khai báo chuân modern:

7. Dim Con2 As New ADODB.Connection

8.  

9. ' B- Khai báo VBA không tuo`ng minh = Không Add References

10. ' 1- Khai báo classic:

11. Dim Con3

12. Set Con3 = CreateObject("ADODB.Connection")

13.   ' Hoac là:

14. Dim Con4 As Object

15. Set Con4 = CreateObject("ADODB.Connection")

16. ' 2 Khai báo modern:

17. Set Con5 = CreateObject("ADODB.Connection")

18.  

19. ' C- Kêt Nôi vo'i Database

20. ' 1- Kêt nôi chuân:

21. Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

22. Con.Open

23. ' 2- Kêt nôi classic:

24. Dim Str As String

25. Str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

26. Con2.Open Str

27. ' 3- Kêt nôi modern:

28. Con5.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db1.mdb"

29.  

30. ' D- Ðóng Kêt Nôi

51

Page 52: adodb

31. ' Không viêc gì mà Ðóng kêt nôi Ðâu phiên hay giua phiên làm viêc! Chi nên Ðóng

cuôi phiên

32. Con.Close

33. Con2.Close

34. Con5.Close

35. Set Con = Nothing

36. Set Con2 = Nothing

37. Set Con5 = Nothing

38. End Sub

Nói thêm về đóng kết nối:a-Nhiều bạn khi mới bắt đầu mở kết nối đã ghi câu:

MÃ: CHỌN TẤT CẢ

1. If Con.State = 1 Then Con.Close

Thành ra là thừa một câu vô dụng.Câu nầy chỉ dùng khi ta muốn chuyển Con qua một Database khácthay vì lệnh:

MÃ: CHỌN TẤT CẢ

1. Con.Close

người cẩn thận ghi:

MÃ: CHỌN TẤT CẢ

1. If Con.State = 1 Then Con.Close

để tránh trường hợp viết 2 lệnh Con.Close sẽ gây lỗib-Khi ra lệnh đóng kết nối, muốn mở lại cùng Database thì chỉ cần viết open là xong

MÃ: CHỌN TẤT CẢ

1. Con.Close

2. Con.Open

Mở database khác, phải khai báo lại Con.ConnectionString 

MÃ: CHỌN TẤT CẢ

1. Con.Close

2. Con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db2.mdb"

3. Con.Open

52

Page 53: adodb

c-Để giải phóng bộ nhớ SAU khi đóng các kết nối ở trên, Bảo Đảm Công Việc Đã Xong, người ta ghi:

MÃ: CHỌN TẤT CẢ

1. Set Con = Nothing

2. Set Con2 = Nothing

3. Set Con5 = Nothing

Trong trường hợp nầy ta không còn viết:

MÃ: CHỌN TẤT CẢ

1. Con.Open

sẽ báo lỗi vì Con không còn gì. Muốn kết nối chịu khó khai lại như ở mục A, Bảo Đảm Công Việc Đã Xong là như thếd- Có Rec là ADODB.Recordset thì trong câu lệnh sau sẽ báo lỗi:

MÃ: CHỌN TẤT CẢ

1. Con.Close

2. Rec.Close

vì Rec chưa đóng thì Con chưa đươc đóng. Phải viết

MÃ: CHỌN TẤT CẢ

1. Rec.Close

2. Con.Close

==================87- Lỗi Run-time error '3021' Either BOF or EOF is true ==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29866

==================88- Chức năng tìm kiếm của Data1==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29939Minh đang làm 1 chương trình Quản lý điểm , trong đó có chức năng tìm kiếm thông tin của 1 học viên theo lựa chon Mã HV or Tên..Sau khi chạy chương trình, mình chọn tìm theo tên, CT báo lỗi ở đoạn lệnh này:

MÃ: CHỌN TẤT CẢ

1. Data1.Recordset.Filter = "Ten '*" & TxtNhapTuKhoa & "*'"

53

Page 54: adodb

- Không chắc Dao có lọc tôt không...- Cú pháp thường là:

MÃ: CHỌN TẤT CẢ

1. data1.recordset.filter = "aaa = 10"

trong đó: aaa là field= là phép so sánh10 là trị sốnếu trị text thì có nháy đơnPhép so sánh có thể là (một trong các phép sau): =, <, >, <>, like, and, or

MÃ: CHỌN TẤT CẢ

1. Data1.Recordset.Filter = "Ten like *" & TxtNhapTuKhoa & "*'"

hoặc

MÃ: CHỌN TẤT CẢ

1. Data1.Recordset.Filter = "Ten = '" & TxtNhapTuKhoa & "'"

Mình thực hiện lệnh của Pác không thấy báo lỗi gì. Có lẽ là được rồi.Nhưng còn một vấn đề nữa xin hỏi là sau khi tìm xong có Pác nào biết đưa thông tin đã tìm được vào DataGrid không?

MÃ: CHỌN TẤT CẢ

1. Data1.Refresh

==================89- Thắc Mắc Về Vòng Lặp For ....==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29940

==================90- VB6.0 có thể kiểm tra 1 Table Access đang đóng hay mở ?http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29974

==================91- Xuất dữ liệu từ datagrid ra excel==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29977

==================92- câu lệnh Select case với mẫu tin có giá trị Null==================

54

Page 55: adodb

http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29978

==================93- Vị trí dòng thú i trong datagrid ?==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29979

==================94- hỏi về lưới datagrid==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29986

==================95- Kỹ thuật ghi hình vào file MDB và load hình từ MDB ra Picture1http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p29988

==================96- Giới thiệu Function Coalesce==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=160#p30116

==================Project minh họa ghi hình vào file MDB==================http://caulacbovb.com/forum/download/file.php?id=3815

==================97- Nói thêm về kiểm tra trùng record==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30574

==================98- Lỗi an out-of-range datetime value==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30575

==================Ứng dụng Client1.exe và Server.exe==================http://caulacbovb.com/forum/download/file.php?id=3864

==================99- Cách dùng BOF và EOF==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30955

==================100- Lệnh Find phải được dùng nhiều hơn==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30956

==================101- Xử lý cột excel sang dòng của access==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30977

==================102- Ký tự thay thế của Like==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p30978

55

Page 56: adodb

==================103- Cách phân trang trong datareport==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p31022

==================104- Tính tổng theo điều kiện==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p31136

==================105- Hỏi về cách chuyển nội dung 1 bảng sang bảng mớhttp://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p31254

==================106- Đưa dữ liệu lên gridview với SQL 2000==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p31517

==================107- Chỉ hiện lên Datagrid vài trường==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p31518

==================108- Tối ưu các trường (định dạng Field)==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=180#p32224

==================109- Project mẫu dùng ADODC==================http://caulacbovb.com/forum/download/file.php?id=4033

==================110- Project mẫu dùng ADODB==================http://caulacbovb.com/forum/download/file.php?id=4053

==================Kiểm tra trùng record trong field khóa chính==================http://caulacbovb.com/forum/viewtopic.php?f=30&p=32486#p32480

==================Giới hạn Update của Recordset==================http://caulacbovb.com/forum/viewtopic.php?f=30&p=32486#p32486

==================Bài viết về lệnh chạy Query==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=200#p32405

==================xuanquy_th bổ sung==================http://caulacbovb.com/forum/viewtopic.php?f=7&t=3942&start=200#p32410

56