Tôi học Database Scripting

Các mẹo vặt linh tinh khác, không thuộc nhóm nào
Đăng trả lời
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Tôi học Database Scripting

Gửi bài by truongphu »

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 tất cả

'1- [b]Tạo một CSDL: new_db.mdb[/b]'(nếu không khai path, new_db.mdb sẽ là App.path\new_db.mdb)' bạn hãy nhớ lòng khi tạo file mới, class dùng là ADOX.Catalog Private Sub Form_Load()Set objConnection = CreateObject("ADOX.Catalog")objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb" '2- [b]Tạo một table trong CSDL ở trên: EventTable[/b]'Khi đã có file CSDL, ta phải Connection với nó:' 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 Set objConnection = CreateObject("ADODB.Connection")objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb" 'Bây giờ tạo table và các field objConnection.Execute "CREATE TABLE EventTable(" & _"EventKey COUNTER ," & _  'Field EventKey định dạng AutoNumber = COUNTER"Category TEXT(50) ," & _  'Field Category định dạng TEXT 50 ký tự, mặc định cho phép 255"ComputerName TEXT(50) ," & _"EventCode INTEGER ," & _"RecordNumber INTEGER ," & _"SourceName TEXT(50) ," & _"TimeWritten DATETIME ," & _"UserName TEXT(50) ," & _"EventType TEXT(50) ," & _"LogFile TEXT(50) ," & _"Message MEMO )"  'định dạng MEMO cho Text hơn 255 ký tựEnd Sub 
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 thành viên
phongvanvu
Guru
Guru
Bài viết: 151
Ngày tham gia: Thứ 4 24/01/2007 2:20 pm
Has thanked: 1 time
Been thanked: 8 times
Tiếp xúc:

Re: Tôi học Database Scripting

Gửi bài by phongvanvu »

Nên thêm:

Mã: Chọn tất cả

 objConnection.Closeset objConnection=nothing 
Để đỡ 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 thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Re: Tôi học Database Scripting

Gửi bài by truongphu »

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 tất cả

Set objConnection = CreateObject("ADOX.Catalog")objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"Set objConnection = CreateObject("ADODB.Connection")objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"objConnection.Execute "CREATE TABLE EventTable(" & _"EventKey COUNTER ," & _  "Category TEXT(50) ," & _ "ComputerName TEXT(50) ," & _"EventCode INTEGER ," & _"RecordNumber INTEGER ," & _"SourceName TEXT(50) ," & _"TimeWritten DATETIME ," & _"UserName TEXT(50) ," & _"EventType TEXT(50) ," & _"LogFile TEXT(50) ," & _"Message MEMO )" 
Kỳ diệu quá! :D
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Re: Tôi học Database Scripting

Gửi bài by truongphu »

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 tất cả

Private Sub Form_Load()'Bài cuSet objConnection = CreateObject("ADOX.Catalog")objConnection.Create "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"Set objConnection = CreateObject("ADODB.Connection")objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"objConnection.Execute "CREATE TABLE EventTable(" & _"EventKey COUNTER ," & _"Category TEXT(50) ," & _"ComputerName TEXT(50) ," & _"EventCode INTEGER ," & _"RecordNumber INTEGER ," & _"SourceName TEXT(50) ," & _"TimeWritten DATETIME ," & _"UserName TEXT(50) ," & _"EventType TEXT(50) ," & _"LogFile TEXT(50) ," & _"Message MEMO )" '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! 'Hai hàng sô cân khai báo, xem ADOVBS.incConst adOpenStatic = 3Const adLockOptimistic = 3 'Khai các kêt nôi quen thuôc'Set objConnection = CreateObject("ADODB.Connection") (Ða có o' trên)Set objRecordSet = CreateObject("ADODB.RecordSet")'objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"objRecordSet.Open "SELECT * FROM EventTable", objConnection, adOpenStatic, adLockOptimistic 'Goi phuong thu'c AddNewobjRecordSet.AddNew'Câu trúc: objRecordSet("Field Name") = "Field Value"objRecordSet("Category") = "Quán Net"objRecordSet("ComputerName") = "Máy A1"objRecordSet("RecordNumber") = "12"objRecordSet("TimeWritten") = "12:30"objRecordSet("UserName") = "Khách" 'Goi phuong thu'c UpdateobjRecordSet.Update 'Ðóng các kêt nôiobjRecordSet.CloseobjConnection.CloseEnd 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: Chủ nhật 13/04/2008 4:01 pm

Re: Tôi học Database Scripting

Gửi bài by tinhlanhuthe »

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 thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Re: Tôi học Database Scripting

Gửi bài by truongphu »

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 tất cả

Private Sub Form_Load()'Làm viêc voi Object scripting, truoc tiên nên bây lôi:On Error Resume NextConst adOpenStatic = 3: Const adLockOptimistic = 3'Khai các kêt nôi quen thuôcSet objConnection = CreateObject("ADODB.Connection")objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & "Data Source = new_db.mdb"Set objRecordSet = CreateObject("ADODB.RecordSet")objRecordSet.Open "SELECT * FROM EventTable", 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 recordDo 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.CloseEnd Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

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

Gửi bài by truongphu »

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
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
viewtopic.php?f=7&t=3942&start=180#p30956

Code Minh họa:

Mã: Chọn tất cả

Private Sub Text1_Change()rs.MoveFirstrs.Find "SBD='" & Text1 & "'"If Not rs.EOF ThenLabel2.Caption = "Trùng Mã Sô"ElseLabel2.Caption = "Không Trùng"End IfEnd 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 về 1534 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Giới hạn Update của Recordset

Gửi bài by truongphu »

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 tất cả

Private Sub Command1_Click()Dim cn As New ADODB.ConnectionDim rs As New ADODB.Recordset    cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\db1.mdb"    cn.CursorLocation = adUseClient    cn.Open    Set rs = cn.Execute("select * from table1")    Do While Not rs.EOF    rs!lop = rs!lop & "B"    rs.Update    rs.MoveNext    LoopEnd Sub
Chắc chắn sẽ báo lỗi:
untitled.JPG
untitled.JPG (11.78 KiB) Đã xem 7438 lần
Cho dù bạn có bổ sung 2 hằng nầy trước khi set rs...

Mã: Chọn tất cả

    rs.CursorType = adOpenStatic    rs.LockType = adLockOptimistic    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 tất cả

Private Sub Command2_Click()Dim cn As New ADODB.ConnectionDim rs As New ADODB.Recordset    cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\db1.mdb"    cn.Open    rs.Open "select * from table1", cn, adOpenStatic, adLockOptimistic        Do While Not rs.EOF    rs!lop = rs!lop & "A"    rs.Update    rs.MoveNext    LoopEnd Sub
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
Hình đại diện của thành viên
truongphu
VIP
VIP
Bài viết: 4785
Ngày tham gia: Chủ nhật 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 528 times

Load Recordset lên ListView

Gửi bài by truongphu »

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

Mã: Chọn tất cả

Dim cn As New ADODB.ConnectionDim rs As New ADODB.Recordset Private Sub Form_Load()cn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & App.Path & "\Quanly.mdb"' chú ý: order  DESC chu' không ASCrs.Open "select * from THISINH order by SBD DESC", cn, adOpenKeyset, adLockPessimistic' Phân chia côt và Tiêu Ðê cua ListView1ListView1.View = lvwReport  ' Ðinh dang báo cáoListView1.ColumnHeaders.Add , "SBD", "SBD"ListView1.ColumnHeaders.Add , "HoTen", "HoTen"ListView1.ColumnHeaders.Add , "NgaySinh", "NgaySinh"ListView1.ColumnHeaders.Add , "NoiSinh", "NoiSinh"ListView1.ColumnHeaders.Add , "Lop", "Lop"ListView1.ColumnHeaders.Add , "Truong", "Truong" Dim itmX As ListItem' Add vào ListViewOn Error Resume Next 'Các giá tri null gây lôiDo While Not rs.EOF    ' câu Ðâu tiên là quan trong.            Set itmX = ListView1.ListItems.Add(1, rs.Fields(1), rs!SBD)            itmX.SubItems(ListView1.ColumnHeaders("HoTen").SubItemIndex) = rs!HoTen            itmX.SubItems(ListView1.ColumnHeaders("NgaySinh").SubItemIndex) = rs!NgaySinh            itmX.SubItems(ListView1.ColumnHeaders("NoiSinh").SubItemIndex) = rs!NoiSinh            itmX.SubItems(ListView1.ColumnHeaders("Lop").SubItemIndex) = rs!Lop            itmX.SubItems(ListView1.ColumnHeaders("Truong").SubItemIndex) = rs!Truong    rs.MoveNextLoopEnd Sub
Tập tin đính kèm
ListView load access.rar
(12.87 KiB) Đã tải về 540 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
quandhk3tin
Bài viết: 1
Ngày tham gia: Thứ 2 16/02/2009 2:53 pm
Đến từ: Ha Noi

Re: Tôi học Database Scripting

Gửi bài by quandhk3tin »

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!
Đăng trả lời

Quay về