• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tôi học Database Scripting

Các mẹo vặt linh tinh khác, không thuộc nhóm nào
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Tôi học Database Scripting

Gửi bàigửi bởi truongphu » T.Bảy 03/05/2008 12:09 pm

Thủ thuật: Tôi học Database Scripting
Tác giả: truongphu từ file TN-040122GStemp_ESD. Microsoft
Mô tả: Thắc mắc dạo nầy phần lớn là CSDL, món nầy tôi hơi yếu nên muốn cùng học chung với các bạn


Trong bài sau đây, Database đươc viết là CSDL và Scripting được dùng là VBS
CSDL có thể là nội dung file Text tuy không được tiện cho lắm, ví dụ Text CSDL có nội dung sau:
"Nguyễn văn A","22/7/1988","57Kg","Viêm Gan Siêu Vi"
"Trần thị B","14/9/1963","40Kg","Hen Phế Quản"
Thao tác với CSDL là file TXT sẽ được nói sau.

Dễ thao tác hơn là file Excel, Các câu lệnh mở file, tìm, đọc, ghi, xóa, lưu trên file XLS khá giống với file MDB. Bài viết sau sử dụng CSDL là MDB vì dạng file nầy được hổ trợ chuyên cho CSDL. Code VBS dựa trên ActiveX Database Object (ADO)

Mã: Chọn hết

  1. '1- Tạo một CSDL: new_db.mdb
  2. '(nếu không khai path, new_db.mdb sẽ là App.path\new_db.mdb)
  3. ' bạn hãy nhớ lòng khi tạo file mới, class dùng là ADOX.Catalog
  4.  
  5. Private Sub Form_Load()
  6. Set objConnection = CreateObject("ADOX.Catalog")
  7. objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  8.  
  9. '2- Tạo một table trong CSDL ở trên: EventTable
  10. 'Khi đã có file CSDL, ta phải Connection với nó:
  11. ' bạn hãy nhớ khi kết nối, class dùng là ADODB.Connection và đây là dạng quen thuộc nhất
  12.  
  13. Set objConnection = CreateObject("ADODB.Connection")
  14. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  15.  
  16. 'Bây giờ tạo table và các field
  17.  
  18. objConnection.Execute "CREATE TABLE EventTable(" & _
  19. "EventKey COUNTER ," & _  'Field EventKey định dạng AutoNumber = COUNTER
  20. "Category TEXT(50) ," & _  'Field Category định dạng TEXT 50 ký tự, mặc định cho phép 255
  21. "ComputerName TEXT(50) ," & _
  22. "EventCode INTEGER ," & _
  23. "RecordNumber INTEGER ," & _
  24. "SourceName TEXT(50) ," & _
  25. "TimeWritten DATETIME ," & _
  26. "UserName TEXT(50) ," & _
  27. "EventType TEXT(50) ," & _
  28. "LogFile TEXT(50) ," & _
  29. "Message MEMO )"  'định dạng MEMO cho Text hơn 255 ký tự
  30. End Sub
  31.  

Các bạn thử chạy Code trên. Hẹn còn tiếp 3/5/08


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
phongvanvu
Guru
Guru
Bài viết: 151
Ngày tham gia: T.Tư 24/01/2007 2:20 pm
Has thanked: 1 time
Been thanked: 8 time
Liên hệ:

Re: Tôi học Database Scripting

Gửi bàigửi bởi phongvanvu » T.Bảy 03/05/2008 3:38 pm

Nên thêm:

Mã: Chọn hết

  1.  
  2. objConnection.Close
  3. set objConnection=nothing
  4.  

Để đỡ chiếm dụng bộ nhớ.
TB: Đây có lẽ là mã VB thì đúng hơn anh Truongphu à. Mã VBS chỉ là tập con của mã VB thôi. VBS thì không cần dịch vẫn chạy được còn đoạn mã trên của a không dịch chắc chẳng chạy được đâu nhỉ?
Live to fight!

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tôi học Database Scripting

Gửi bàigửi bởi truongphu » T.Bảy 03/05/2008 4:31 pm

Cảm ơn phongvanvu nhắc giải phóng nhớ
bài tiếp theo: ghi thông tin vào field nối liền bài trên, định sau đó đóng các kết nối luôn thể

Thì đây là mã VB mà, tôi gởi vào Tip VB
Nếu muốn dùng chính thức VBS với đoạn code trên, xin bỏ 2 câu của VB là:
Private Sub Form_Load()
End Sub


Xong lưu dưới dạng định *.VBS, bảo đảm với phongvanvu và các bạn, file tự chạy và đương nhiên ra sản phẩm là file new_db.mdb cùng thư mục của file VBS

Tôi đã Test, gởi các bạn code trên đã bỏ râu ria, xin lưu với đuôi VBS

Mã: Chọn hết

  1. Set objConnection = CreateObject("ADOX.Catalog")
  2. objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  3. Set objConnection = CreateObject("ADODB.Connection")
  4. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  5. objConnection.Execute "CREATE TABLE EventTable(" & _
  6. "EventKey COUNTER ," & _  
  7. "Category TEXT(50) ," & _
  8. "ComputerName TEXT(50) ," & _
  9. "EventCode INTEGER ," & _
  10. "RecordNumber INTEGER ," & _
  11. "SourceName TEXT(50) ," & _
  12. "TimeWritten DATETIME ," & _
  13. "UserName TEXT(50) ," & _
  14. "EventType TEXT(50) ," & _
  15. "LogFile TEXT(50) ," & _
  16. "Message MEMO )"

Kỳ diệu quá! :D
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tôi học Database Scripting

Gửi bàigửi bởi truongphu » CN 04/05/2008 8:12 am

Viết tiếp:
3- Ghi giá trị mới vào Field: Qua các bước: Kết nối file CSDL, kết nối Recordset, dùng AddNew, ghi giá trị mới vào Field, gọi Update và đóng các kết nối.

Mã: Chọn hết

  1. Private Sub Form_Load()
  2. 'Bài cu
  3. Set objConnection = CreateObject("ADOX.Catalog")
  4. objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  5. Set objConnection = CreateObject("ADODB.Connection")
  6. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  7. objConnection.Execute "CREATE TABLE EventTable(" & _
  8. "EventKey COUNTER ," & _
  9. "Category TEXT(50) ," & _
  10. "ComputerName TEXT(50) ," & _
  11. "EventCode INTEGER ," & _
  12. "RecordNumber INTEGER ," & _
  13. "SourceName TEXT(50) ," & _
  14. "TimeWritten DATETIME ," & _
  15. "UserName TEXT(50) ," & _
  16. "EventType TEXT(50) ," & _
  17. "LogFile TEXT(50) ," & _
  18. "Message MEMO )"
  19.  
  20. 'Viêt tiêp bài o' trên. Ghi chú: Nêu file new_db.mdb tôn tai, se báo lôi!
  21.  
  22. 'Hai hàng sô cân khai báo, xem ADOVBS.inc
  23. Const adOpenStatic = 3
  24. Const adLockOptimistic = 3
  25.  
  26. 'Khai các kêt nôi quen thuôc
  27. 'Set objConnection = CreateObject("ADODB.Connection") (Ða có o' trên)
  28. Set objRecordSet = CreateObject("ADODB.RecordSet")
  29. 'objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  30. objRecordSet.Open "SELECT * FROM EventTable", objConnection, adOpenStatic, adLockOptimistic
  31.  
  32. 'Goi phuong thu'c AddNew
  33. objRecordSet.AddNew
  34. 'Câu trúc: objRecordSet("Field Name") = "Field Value"
  35. objRecordSet("Category") = "Quán Net"
  36. objRecordSet("ComputerName") = "Máy A1"
  37. objRecordSet("RecordNumber") = "12"
  38. objRecordSet("TimeWritten") = "12:30"
  39. objRecordSet("UserName") = "Khách"
  40.  
  41. 'Goi phuong thu'c Update
  42. objRecordSet.Update
  43.  
  44. 'Ðóng các kêt nôi
  45. objRecordSet.Close
  46. objConnection.Close
  47. End Sub

Và như đã nói ở trên, bạn có thể run theo project của VB hay lưu dưới dạng VBS
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

tinhlanhuthe
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 68
Ngày tham gia: CN 13/04/2008 4:01 pm

Re: Tôi học Database Scripting

Gửi bàigửi bởi tinhlanhuthe » T.Ba 06/05/2008 9:22 am

Vậy còn delete và update field thì sao hả bạn, chỉ giúp luôn đi ! Thanks nhiêu.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Tôi học Database Scripting

Gửi bàigửi bởi truongphu » T.Ba 06/05/2008 10:32 am

Bài sau đây viết nhanh:
- duyệt recordset
- đếm số lượng record
- xóa record
- update (bài trên có nói)

Mã: Chọn hết

  1. Private Sub Form_Load()
  2. 'Làm viêc voi Object scripting, truoc tiên nên bây lôi:
  3. On Error Resume Next
  4. Const adOpenStatic = 3: Const adLockOptimistic = 3
  5. 'Khai các kêt nôi quen thuôc
  6. Set objConnection = CreateObject("ADODB.Connection")
  7. objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"
  8. Set objRecordSet = CreateObject("ADODB.RecordSet")
  9. objRecordSet.Open "SELECT * FROM EventTable", objConnection, adOpenStatic, adLockOptimistic
  10. 'Duyêt qua Recorset: Goi hàng 1 và di chuyên Ðên hàng cuôi cùng
  11. objRecordSet.MoveFirst
  12. 'Ngang Ðây, ta có thê biet sô luong record:
  13. MsgBox objRecordSet.RecordCount
  14. 'Bat Ðâu duyêt record
  15. Do Until objRecordSet.EOF
  16. '. . . Làm viêc gì o' Ðây trong khi duyêt Recorset: Ví du: MsgBox Item("ComputerName")
  17. MsgBox objRecordSet.Fields.Item("ComputerName")
  18. 'Nêu muôn, xóa record, update
  19. objRecordSet.Delete
  20. 'objRecordSet.Update '<-- Ðu`ng nên Ðê o Ðây, mà Ðê ngoai vòng lap
  21. '. . .
  22. objRecordSet.MoveNext
  23. Loop
  24. objRecordSet.Update
  25. 'Ðóng các kêt nôi
  26. objRecordSet.Close
  27. objConnection.Close
  28. End Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Kiểm tra trùng record trong field khóa chính

Gửi bàigửi bởi truongphu » T.Ba 06/01/2009 8:41 am

Khi ta addnew, nếu record trong field khóa chính bị trùng sẽ báo lỗi phiền phức.
Tôi đã trình bày các cách để kiểm tra việc trùng record nầy:
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

Phổ biến trong forum chúng ta là dùng SQL "Select..." để tìm RecordCount. Tuy nhiên để thi hành SQL, nêu chỉ dùng một Recordset ta phải đóng rồi mở... sẽ có tác động liên quan đến các control có bind với recorset.
Ta có thể dùng lệnh Find để làm điều nầy. Lệnh nầy tôi cũng có phân tích kỹ trong các bài:
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

Code Minh họa:

Mã: Chọn hết

  1. Private Sub Text1_Change()
  2. rs.MoveFirst
  3. rs.Find "SBD='" & Text1 & "'"
  4. If Not rs.EOF Then
  5. Label2.Caption = "Trùng Mã Sô"
  6. Else
  7. Label2.Caption = "Không Trùng"
  8. End If
  9. End Sub

Tôi đính kèm Project để các bạn tiện dụng
Tập tin đính kèm
Proiect1.rar
(13.7 KiB) Đã tải 1391 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Giới hạn Update của Recordset

Gửi bàigửi bởi truongphu » T.Ba 06/01/2009 9:42 am

Khi bạn dùng đối tượng adodb.connection để execute một câu truy vấn nào đó, kết quả sẽ được gán cho một adodb.recordset. Với recordset nầy, ta không thể update được vì phương thưc tạo recordset thiếu các hằng CursorType và LockType cho phép update. Vì thiếu khai báo nên LockType default sẽ là adLockReadOnly = miễn Update. Ta xem code sau:

Mã: Chọn hết

  1. Private Sub Command1_Click()
  2. Dim cn As New ADODB.Connection
  3. Dim rs As New ADODB.Recordset
  4.     cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\db1.mdb"
  5.     cn.CursorLocation = adUseClient
  6.     cn.Open
  7.     Set rs = cn.Execute("select * from table1")
  8.     Do While Not rs.EOF
  9.     rs!lop = rs!lop & "B"
  10.     rs.Update
  11.     rs.MoveNext
  12.     Loop
  13. End Sub

Chắc chắn sẽ báo lỗi:
untitled.JPG
untitled.JPG (11.78 KiB) Đã xem 5175 lần

Cho dù bạn có bổ sung 2 hằng nầy trước khi set rs...

Mã: Chọn hết

  1.    rs.CursorType = adOpenStatic
  2.     rs.LockType = adLockOptimistic
  3.     Set rs = cn.Execute("select * from table1")

thì cũng chẳng tác dụng

Trở lại dùng adodb.recordset để mở table, ta Update nhẹ nhàng với câu lệnh trên:

Mã: Chọn hết

  1. Private Sub Command2_Click()
  2. Dim cn As New ADODB.Connection
  3. Dim rs As New ADODB.Recordset
  4.     cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\db1.mdb"
  5.     cn.Open
  6.     rs.Open "select * from table1", cn, adOpenStatic, adLockOptimistic
  7.         Do While Not rs.EOF
  8.     rs!lop = rs!lop & "A"
  9.     rs.Update
  10.     rs.MoveNext
  11.     Loop
  12. End Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Load Recordset lên ListView

Gửi bàigửi bởi truongphu » T.Sáu 09/01/2009 4:22 pm

Sau đây là code ví dụ Load Recordset lên ListView

Mã: Chọn hết

  1. Dim cn As New ADODB.Connection
  2. Dim rs As New ADODB.Recordset
  3.  
  4. Private Sub Form_Load()
  5. cn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\Quanly.mdb"
  6. ' chú ý: order  DESC chu' không ASC
  7. rs.Open "select * from THISINH order by SBD DESC", cn, adOpenKeyset, adLockPessimistic
  8. ' Phân chia côt và Tiêu Ðê cua ListView1
  9. ListView1.View = lvwReport  ' Ðinh dang báo cáo
  10. ListView1.ColumnHeaders.Add , "SBD", "SBD"
  11. ListView1.ColumnHeaders.Add , "HoTen", "HoTen"
  12. ListView1.ColumnHeaders.Add , "NgaySinh", "NgaySinh"
  13. ListView1.ColumnHeaders.Add , "NoiSinh", "NoiSinh"
  14. ListView1.ColumnHeaders.Add , "Lop", "Lop"
  15. ListView1.ColumnHeaders.Add , "Truong", "Truong"
  16.  
  17. Dim itmX As ListItem
  18. ' Add vào ListView
  19. On Error Resume Next 'Các giá tri null gây lôi
  20. Do While Not rs.EOF
  21.     ' câu Ðâu tiên là quan trong.
  22.             Set itmX = ListView1.ListItems.Add(1, rs.Fields(1), rs!SBD)
  23.             itmX.SubItems(ListView1.ColumnHeaders("HoTen").SubItemIndex) = rs!HoTen
  24.             itmX.SubItems(ListView1.ColumnHeaders("NgaySinh").SubItemIndex) = rs!NgaySinh
  25.             itmX.SubItems(ListView1.ColumnHeaders("NoiSinh").SubItemIndex) = rs!NoiSinh
  26.             itmX.SubItems(ListView1.ColumnHeaders("Lop").SubItemIndex) = rs!Lop
  27.             itmX.SubItems(ListView1.ColumnHeaders("Truong").SubItemIndex) = rs!Truong
  28.     rs.MoveNext
  29. Loop
  30. End Sub
Tập tin đính kèm
ListView load access.rar
(12.87 KiB) Đã tải 466 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

quandhk3tin
Bài viết: 1
Ngày tham gia: T.Hai 16/02/2009 2:53 pm
Đến từ: Ha Noi

Re: Tôi học Database Scripting

Gửi bàigửi bởi quandhk3tin » T.Sáu 08/05/2009 11:16 pm

Em đã thử và chạy chương trình của anh Truongphu về trường hợp trùng khóa chính khi lưu record. Nhưng vẫn báo lỗi. Lỗi hiển thị tại dòng adodv.recordset.movefirst
Vậy xin anh kiểm tra lại và giúp đỡ cho em.
Cảm ơn anh!


Quay về “[VB] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách