Tự học lập trình cơ sở dữ liệu với Visual Basic 5 trong 21 ngày ấn phẩm 2



tải về 0.58 Mb.
trang10/13
Chuyển đổi dữ liệu26.04.2018
Kích0.58 Mb.
#37160
1   ...   5   6   7   8   9   10   11   12   13

Sau khi bạn đặt các điều khiển trên form và đặt lại kích cỡ của chúng, bạn cần đặt đoạn mã 3.10 trong đoạn thông báo của form, đoạn mã này định nghĩa vài biến mà bạn sử dụng trong suốt form.


Đoạn 3.10 : Đoạn mã khai báo cho đề án TBSEEK.VBP :
Option Explicit

`

` form-level variables



`

Dim db As Database

Dim rs As Recordset

`

Dim strDBName As String



Dim strRSName As String

Dim strIndex As String

Dim strField As String
Đặt đoạn mã 3.11 vào trong sự kiện Form_Load của form. Đoạn mã này mở cơ sở dữ liệu BOOKS5.MBD và mở bảng Titles.
Đoạn 3.11 :
Private Sub Form_Load()

`

` set vars



strDBName = App.Path & "\..\..\Data\Books5.mdb"

strRSName = "Titles"

`

` open database and table



Set db = DBEngine.OpenDatabase(strDBName)

Set rs = db.OpenRecordset(strRSName, dbOpenTable)

`

End Sub
Đặt thủ tục trong đoạn 3.12 vào đoạn khai báo. Đây là thủ tục đặt index của bảng và nạp listbox trong danh sách hợp lý.


Đoạn 3.12 :
Public Sub LoadList()

`

` load data collection into list box



`

Dim strLine As String

lstRecordset.Clear

`

rs.Index = strIndex



rs.MoveFirst

`

On Error Resume Next ` in case we get null fields



`

Do While Not rs.EOF

strLine = rs.Fields("Title")

strLine = strLine & " | " & CStr(rs.Fields("YearPub"))

strLine = strLine & " | " & CStr(rs.Fields("ISBN"))

strLine = strLine & " | " & CStr(rs.Fields("PubID"))

lstRecordset.AddItem strLine

rs.MoveNext

Loop

`

lblIndex.Caption = "Titles Table - Indexed by [" & strField & "]"



`

End Sub
Thủ tục LoadList là một ví dụ của một cách để nạp một list box của Visual Basic với dữ liệu từ một bảng. Thủ tục đầu tiên là dọn những gì không thích hợp trong list box. Sau đó thuộc tính Index của đối tượng table đặt và chuyển đến bản ghi đầu tiên trong bảng.


Lệnh Do White.. Loop xây dựng để đọc mỗi bản ghi trong bảng và tạo một dòng text đơn ( strLine ) nó chứa mỗi trường được ngăn cách bởi một dấu cách. Chú ý rằng bạn cần sử dụng hàm CStr () để chuyển trường số trong bảng ( Year Pub, ISBN, Pub_ID ) thành giá trị xâu trước khi bạn có thể thêm chúng đến strLine. Sau khi dòng đó được xây dựng, strLine được thêm vào listbox sử dụng phương thức lstRecordset.AddNew. Sau khi dòng được thêm vào listbox, record pointer tiến tới sử dụng phương thức rs.MoveNext. Công việc này làm tiếp tục cho đến khi không còn các bản ghi trong bảng.
Ba đoạn mã sau viết vào nút lệnh thích hợp để đặt các index. Chúng đặt các giá trị cho việc lựa chọn các index, thiết lập hiển thị,và gọi thủ tục nạp vào listbox.
Đặt đoạn mã này trong sự kiện cmdTitle_Click :

Private Sub cmdTitle_Click()

`

` set for Title index



`

strIndex = "Title"

strField = "Title"

LoadList


`

End Sub
Đặt đoạn mã này trong sự kiện cmdISBN_Click :


Private Sub cmdISBN_Click()

`

` set for ISBN index



`

strIndex = "PrimaryKey"

strField = "ISBN"

LoadList


`

End Sub
Đặt đoạn mã này trong sự kiện cmdPublisher_Click :


Private Sub cmdPublisher_Click()

`

` set for PubID index



`

strIndex = "PubID"

strField = "PubID"

LoadList


`

End Sub
Thủ tục Seek được xem trong đoạn 3.13 gọi một input box để nhắc người sử dụng cho giá trị tìm kiếm, để thực hiện tìm kiếm và thông báo kết quả của cuộc tìm kiếm. Thủ tục đầu tiên kiểm tra xem có người sử dụng nào đã điền vào listbox bằng cách lựa chọn một index Nếu listbox chứa dữ liệu, thông thường gọi hàm InputBox của Visual Basic để người sử dụng nhập vào và sau đó gọi phương thức Seek của đối tượng table. Nếu bản ghi không được tìm thấy, bạn nhìn thấy một thông điệp Seek Failed. Nếu bạn nhập một bản ghi vào tệp tin,bạn nhìn thấy một thông điệp Record Found.


Đoạn 3.13 :
Private Sub cmdSeek_Click()

`

` perform table seek



`

Dim strSeek As String

`

If lstRecordset.ListCount = 0 Then



MsgBox "Select an Index First!", vbExclamation, "Missing Index"

Else


strSeek = InputBox("Enter a Seek value for " & strField)

rs.Seek "=", strSeek

If rs.NoMatch = True Then

MsgBox strSeek & " not in table", vbCritical, "Seek Failed"

Else

MsgBox rs.Fields("Title"), vbInformation, "Record Found"



End If

End If


`

End Sub
Tất nhiên mọi đề án nên có một nút Exit. Hãy nhập dòng sau cho nút Exit :


Private Sub cmdExit_Click()

`

` end program



`

rs.Close


db.Close

Set rs = Nothing

Set db = Nothing

Unload Me



`

End Sub
Khi bạn đã hoàn thành đoạn mã, lưu form như TBSEEK.FRM và đề án như TBSEEK.VBP và chạy chương trình. Hãy kích vào nút Title, ISBN, hoặc Publisher để đặt các index và nạp vào listbox. Chú ý rằng mỗi lần bạn lựa chọn một nút khác nhau, danh sách được nạp trong một loại khác nhau. Sau khi danhsachs được nạp, kích vào nút Seek để thực hiện một index tìm kiếm trên bảng dữ liệu. Nếu bạn nhập giá trị trong index, chương trình thông báo đầu đề của cuốn sách trong một message box, không thì, bạn nhìn thấy một thông diệp lỗi. Hãy xem hình 3.7.


Hình 3.7 :
Những giới hạn của đối tượng Table-type Recordset.
Mặc dù đối tượng Table-type Recordset của Visual Basic cung cấp tốc độ tìm kiếm nhanh nhất của hoàn toàn các đối tượng dữ liệu, nó cũng có đoi chút hạn chế. Bạn không thể sắp xếp một bảng ; bạn không thể sử dụng đối tượng Table khi đang truy cập dữ liệu nguồn ODBC và bạn không thể sử dụng điều khiển dữ liệu của Visual Basic để truy cập một đối tượng Table. Các Table không thể sử dụng các Bookmark, các Sort, hoặc Filter không như Dynaset và Snapshot, đối tượng Table của Visual Basic không thể có sorted, filtered, hoặc có bookmark. Thay vì sắp xếp dữ liệu, bạn có thể sử dụng đối tượng Index để thiết lập sắp xếp trong bảng. Nếu bạn cần lọc bảng ( thường là một bảng lớn ), bạn cần tạo một Dynaset hoặc Snapshot chứa một nhóm dữ liệu trong bảng.
Các đối tượng Table không thể sử dụng các Bookmark, do vậy bạn không thể đánh dấu vị trí trong một bảng, hãy chuyển xung quanh, và sau đó trở lại nơi sử dụng các Bookmark của Visual Basic. Bạn có thể, tuy nhiên, thay vì lưu giá trị chỉ số của bảng. bảng phải có một index công khai và bạn phải hiểu các trường được sử dụng trong index công khai. Bạn không thể lấy thông tin này từ form Design của Data Manager, và bạn không thể lấy nó tại lúc thực hiện bằng việc đọc thuộc tính Index.Name và Index.Fields của đối tượng Table. Để tham khảo đoạn trên đối tượng Database cho một ví dụ của việc làm thế nào để đọc thuộc tính Index.Name và Index.Fields của một bảng. ODBC Data Source Limitations. Nếu bạn dự kiến làm công việc nào với dữ liệu nguồn ODBC, bạn phải quên việc sử dụng đối tượng Table của Visual Basic. Nó không có vấn đề gì xảy ra có chăng ODBC là một SQL Server hoặc một bảng tính ( spreadsheet ) trên trạm làm việc cục bộ của bạn. Bạn không thể định nghĩa một đối tượng Table để truy cập dữ liệu. Bạn phải sử dụng đối tượng Dynaset hoặc Snapshot cho yêu cầu dữ liệu của ODBC.
Lý do đối với giới hạn này là bộ phận điều khiển của ODBC cho phép Visual Basic truy cập bất cứ kiểu dữ liệu ảo nào. Đó không phải là điều kiện tất yếu mà dữ liệu nguồn tuân theo với định dạng bảng dữ liệu của data engine của Visual Basic. Bởi vì đối tượng table được thiết kế đặc biệt để cung cấp trực tiếp việc truy cập đến các bảng dữ liệu của Visual Basic. Nó có thể chỉ được sử dụng để truy một bảng dữ liệu đã có sẵn như một bảng dữ liệu có trong một cơ sở dữ liệu của Microsoft Access.
Khi nào sử dụng đối tượng Table-type Recordset.
Đối tượng Table–type Recordset của Visual Basic là sự lựa chọn tốt nhất khi bạn cần tăng tốc độ tìm kiếm của các bảng dữ liệu lớn. Miễn là bạn không cần truy cập đến dữ liệu nguồn ODBC và bạn không cần lấy một bộ dữ liệu cho việc xử lý. Đối tượng Table là một sự lựa chọn tuyệt vời.
Tuy vậy, bạn cần xử lý một bộ dữ liệu thay vì các bản ghi đơn, đối tượng table không làm việc dễ dàng hoặc nhanh như một đối tượng Dynaset hoặc Snapshot.
Đối tượng Snapshot-type Recordset.
Các đối tượng Snapshot-type Recordset của Visual Basic hầu hết đều giống Dynaset-type Recordset trong cách chạy và các thuộc tính. Tuy vậy có hai vấn đề khác giữa Snapshot và Dynaset. Hai vấn đề khác nhau đó là các khía cạnh quan trọng của Snapshot :
+ Snapshot được lưu chọn vện trọng bộ nhớ.
+ Snapshot chỉ đọc và không cập nhật các đối tượng bảng.
Thay vì xem lại các sức mạnh và các giới hạn của đối tượng Snapshot, chúng ta hãy xem kỹ hai thuộc tính của Snapshot. Bạn cần cân nhắc một vài thứ khi sử dụng đối tượng Snapshot. Cho ví dụ, không như Dynaset của Visual Basic, đối tượng Snapshot được lưu chọn vẹn tại trạm làm việc. Nếu bạn tạo một Snapshot chứa 500 bản ghi, tất cả 500 bản ghi được chuyển đến bảng dữ liệu ngay lập tức đến trạm làm việc của bạn và nạp vào bộ nhớ RAM. Nếu trạm làm việc không có đủ RAM, các bản ghi được lưu trong một tệp tin tạm thời trên một ổ đĩa cục bộ.
Bởi vì tất cả các bản ghi yêu cầu được nạp lên máy cục bộ, khởi tạo các yêu cầu cho dữ liệu của Snapshut có thể chuyển lâu hơn Dynaset. Tuy vậy, khi các bản ghi được tìm thấy và được lưu cục bộ, tiếp theo việc truy cập đến các bản ghi trong phạm vi nhất định của đối tượng Snapshot nhanh hơn đối tượng Dynaset. Cũng bởi vì các bản ghi phải được lưu cục bộ, bạn phải cẩn thận không để một dataset quá lớn.
Snapshot là những cái nhìn động của các bảng cơ sở. Nếu bạn yêu cầu một bộ các bản ghi trong trong một đối tượng Snapshot và sau đó mọi người xoá vài bản ghi từ bảng cơ sở, dataset của Snapshot không phản ánh các thay đổi trong bảng cơ sở. chỉ có cách bạn học về các thay đổi trong bảng cơ sở là tạo một Snapshot mới bằng cách làm một yêu cầu ( request ) mới. Snapshot-type Recordset là đối tượng chỉ đọc. Bạn không thể sử dụng Snapshut để cập nhật các bảng. Bạn chỉ có thể sử dụng chúng để xem ( view ) dữ liệu. Đó là bởi vì Snapshot trên thực tế có một bản sao các bản ghi được tạo tại trạm làm việc cục bộ của bạn.
Đề án trong đoạn 3.14 làm rõ hoạt động bên ngoài của đối tượng Snapshot để so sánh chức năng bên ngoài của đối tượng Dynaset và đối tượng Table. Hãy bắt đầu một đề án Standar EXE mới. Không có các điều khiển trong đề án này, do vậy chắc chắn thêm vào Microsoft DAO 3.5 Object Library để truy cập các đối tượng dữ liệu.
Hãy nhập toàn bộ mã nguồn vào trong một form đơn và lưu nó như là SNAPSHOTS.FRM và SNAPSHOTS.VBP.
Đoạn 3.14 : So sánh Snashot-type và Dynaset-type Record set :
Option Explicit

`

` form level variables



`

Dim db As Database

Dim rsDynaset As Recordset

Dim rsSnapshot As Recordset

Dim rsTable As Recordset

`

Dim strDBName As String



Dim strRSName As String

Dim varRecords As Variant

Dim intReturned As Integer

Dim intColumns As Integer


Private Sub Form_Activate()

`

` main control routine



`

strDBName = App.Path & "\..\..\Data\books5.mdb"

strRSName = "Titles"

OpenFiles

`

` show title



Me.Cls

Me.Print "Comparing Recordset Types (Dynaset, Snapshot, & Table)"

Me.Print

`

` show first compare



Me.Print ">First Pass"

CountRecs rsDynaset, "Dynaset"

CountRecs rsSnapshot, "Snapshot"

CountRecs rsTable, "Table"

Me.Print

`

` save rec, delete it, count



SaveDynasetRec

DeleteDynasetRec

Me.Print ">After Dynaset Delete"

CountRecs rsDynaset, "Dynaset"

CountRecs rsSnapshot, "Snapshot"

CountRecs rsTable, "Table"

Me.Print

`

` restore rec and count



RestoreDynasetRec

Me.Print ">After Dynaset Restore"

CountRecs rsDynaset, "Dynaset"

CountRecs rsSnapshot, "Snapshot"

CountRecs rsTable, "Table"

Me.Print


`

End Sub
Public Sub OpenFiles()

`

` open database and



` populate objects

`

Set db = DBEngine.OpenDatabase(strDBName)



`

With db


Set rsDynaset =.OpenRecordset(strRSName, dbOpenDynaset)

Set rsSnapshot =.OpenRecordset(strRSName, dbOpenSnapshot)

Set rsTable =.OpenRecordset(strRSName, dbOpenTable)

End With


`

End Sub
Public Sub CountRecs(rsTemp As Recordset, strType As String)

`

` count records in the object



`

Dim intCount As Integer

`

With rsTemp



.MoveFirst

.MoveLast

intCount =.RecordCount

End With


`

Me.Print vbTab, "Total for " & strType & ":"; intCount

`

End Sub
Public Sub SaveDynasetRec()



`

` save a single record

`

With rsDynaset



.MoveFirst

varRecords =.GetRows(1)

End With

`

End Sub


Public Sub DeleteDynasetRec()

`

` remove first record in the collection



`

With rsDynaset

.MoveFirst

.Delete


End With

`

End Sub


Public Sub RestoreDynasetRec()

`

` add saved rec back in



`

Dim intLoop As Integer

`

With rsDynaset



.AddNew

For intLoop = 0 To UBound(varRecords, 1)

.Fields(intLoop).Value = varRecords(intLoop, 0)

Next


.Update

End With


`

End Sub
Mặc dù không có nhiều mã trong ví dụ này, có một vài thứ giá trị được chỉ ra ( point out ) Đầu tiên, bạn nhìn thấy sử dụng cấu trúc With.. End With. Cấu trúc ( construct ) này đã trình bày trong Visual Basic 4.0 và nó rất hữu ích khi làm việc với các đối tượng của Visual Basic. Việc sử dụng cấu trúc With.. End With là nhanh hơn tên các đối tượng tương tự trong đoạn mã.


Ngoài ra, chú ý sử dụng phương thức GetRows của Recordset. Phương thức này điền một biến khác nhau với nộ dung của một hoặc nhiều hơn các bản ghi từ Recordset. Đây là một cách rất hiệu quả để đọc một vài bản ghi trong bộ nhớ không sử dụng vòng lặp chậm hơn For.. Next.
Khi bạn chạy chương trình SNAPSHOTS.VBP, bạn nhìn thấy tổng số của ba bản ghi được thông báo. Thông báo đầu tiên xuất hiện đúng sau khi các đối tượng dữ liệu được tạo. Thông báo của second count xuất hiện sau khi một bản ghi đã được gỡ bỏ ( removed ) từ đối tượng Dynaset. Thông báo của Last count xuất hiện sau khi bản ghi được phục hồi lạ đối tượng Dynaset. Chú ý cả hai đối tượng Table và Dynaset phản ánh những thay đổi trong bảng, nhưng đối tượng Snapshot thì không ( xem hình 3.8 ).
Hình 3.8 : So sánh Dyanaset, Table và Snapshot :
Khi nào sử dụng đối tượng Snapshot.
Các đối tượng Snapshot-type Recordset làm việc tốt nhất nếu bạn có một bộ dữ liệu nhỏ mà bạn cần truy cập thường xuyên. Cho ví dụ, nếu bạn có một danh sách của các giá trị valid input cho một trường riêng biệt ( particular ) được lưu trong một bảng điều khiển, bạn có thể nhập các giá trị hợp lý đó voà trong một Snapshot và tham khảo ( refer ) đến dataset đó mỗi lần xác minh người sử dụng nhập vào.
Nếu dataset không quá lớn, các Snapshot rất tốt cho sử dụng trong việc tạo các thông báo tính toán hoặc hiện thị đồ thị. Nó thường là một ý tưởng tốt để tạo một dataset động cho sử dụng trong thông báo các tính toán. Cách này, có những thay đổi nào trong dataset mà có thể xuất hiện trong môi trường đa người sử dụng từ lần bạn bắt đầu thông báo ( report ) đến lần bạn kết thúc, nó sẽ không làm xáo trộn các tính toán đã được thực hiện bởi thông báo ( report ).


Mẹo : Nó là một ý tưởng tốt để giữ các Snapshot của bạn ít hơn 64 Kb. Bạn có thể ước lượng kích cỡ cuối cùng của các Snapshot bằng cách tính toán số byte trong một bản ghi bình thường và ước lượng số trung bình của các bản ghi bạn có thể mong đợi trong Snapshot. Bạn có thể tham khảo đến ngày thứ 2 “ Việc tạo các cơ sở dữ liệu ”, để biết thêm thông tin về kích cỡ kiểu của Visual Basic.

Các đối tượng Database.


Đối tượng Database của một điều khiển dữ liệu của Visual Basic cho phép bạn truy cập tất cả các thuộc tính và phương thức kết hợp với điều khiển dữ liệu cơ sở của cơ sở dữ liệu. Bằng cách sử dụng các đối tượng quan hệ, các TableDef, Field, Index, bạn có thể lấy thông tin về tất cả các bảng trong cơ sở dữ liệu, tất cả các indẽ trong cơ sở dữ liệu,và tất cả các trường trong mỗi bảng. Ngoài ra, bạn có thể lấy thêm thông tin về các kiểu trường và các tham số index.
Đối tượng Database là hữu ích nhất khi bạn đang phát triển các đặc điểm chung của cơ sở dữ liệu. Bởi vì đối tượng Database cho phép bạn truy cập tất cả các tên trường và các thuộc tính, bạn có thể sử dụng thông tin này để viết hieer thị bảng chung và cập nhật các công việc hàng ngày thay vì phải viết các công việc đó có các tên trường của mã cứng ( hard-coded ) và các kiểu dữ liệu. Các đối tượng TableDef được đưa ra vào ngày thứ 10 “ Việc tạo các chương trình cơ sở dữ liệu với mã Visual Basic ”. Đối với bây giờ, chúng ta hãy viết một thủ tục ngắn là danh sách tất cả các bảng, các trường, các index trong cơ sở dữ liệu BOOKS5.MDB.
Đầu tiên, hãy bắt đầu với đề án Standard EXE mới trong Visual Basic 5 và nạp Microsoft DAO 3.5 Object Library. Sử dụng thông tin trong bảng 3.3 để đặt các thiết lập thuộc tính của form và đặt điều khiển dữ liệu trên form.
Bảng 3.3 : Các điều khiển cho đề án 04ABC1. MAK.
Bây giờ đã chắc chắn đặt điều khiển dữ liệu tại đáy của form. Nó chỉ ở đó để cho phép bạn truy cập các thuộc tính cơ sở dữ liệu khác nhau mà bạn in trên bản thân form. Nhập đoạn mã 3.15 vào sự kiện Form_Ativate.
Đoạn 3.15 :
Private Sub Form_Activate()

`

` show high-level database objects



`

Dim tb As TableDef

Dim fl As Field

Dim ix As Index


Data1.DatabaseName = App.Path & "\..\..\data\books5.mdb"

Data1.Refresh

`

For Each tb In Data1.Database.TableDefs



Me.Print "Table Info:"

Print " "; tb.Name

For Each fl In tb.Fields

Print " -"; fl.Name

Next

MsgBox "Press OK to continue"



Me.Cls

Next


`

On Error Resume Next ` in case there's no index

`

For Each tb In Data1.Database.TableDefs



Me.Print "Index Info:"

Print " "; tb.Name

For Each ix In tb.Indexes

Print " -"; ix.Name;

Print "[";

Print ix.Fields;

Print "]"

Next


MsgBox "Press OK to continue"

Me.Cls


Next

`

End Sub


Sau khi bạn nhập đoạn mã này, hãy lưu form là DATABASE.FRM và DATABASE.VBP và chạy chương trình. Bạn nhìn thấy một danh sách trên màn hình đưa ra các tên của bảng, một danh sách của tất cả các trường trong bảng và một hộp hội thoại. Kích vào hộp hội thoại để tiếp tục đến bangrg tiếp theo. Sau khi kích nút OK, bạn nhìn thấy một danh sách của mỗi index được định nghĩa cho mỗi bảng, bạn cũng có thể kích bất cứ một cái nào tại một thời điểm. Hai màn hình của bạn nhìn một vài thứ như trong hình 3.9 đối với các bảng và hình 3.10 đối với các index.

Hình 3.9 :




Chú ý : Ngay khi bạn kích vào các bảng của cơ sở dữ liệu, bạn nhìn thấy một vài bảng mà bắt đầu với “ MSYS ”. Đó là các bảng hệ thống được sử dụng bởi Microsoft Jet database engine và không được sử dụng cho việc lưu trữ dữ liệu hoặc phục hồi. Bạn cũng nên chú ý rằng mỗi đối tượng Index gồm có một tên độc nhất và một hoặc hơn các trường ( được hiện thị trong dấu móc ) . Bạn không nhìn thấy một bảng được kết hợp với index bởi vì Microsoft Jet engine không lưu thông tin đó trong một kiểu bạn có thể dễ dàng nhìn thấy./

Каталог: file -> downloadfile5 -> 169
file -> CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
file -> CỘng hòa xã HỘi chủ nghĩa việt nam độc lập Tự do Hạnh phúc
file -> TIÊu chuẩn quốc gia tcvn 7790-5 : 2008 iso 2859-5 : 2005
file -> Qcvn 81: 2014/bgtvt
file -> UỶ ban nhân dân cộng hòa xã HỘi chủ nghĩa việt nam
file -> VIỆn chăn nuôi trịnh hồng sơn khả NĂng sản xuất và giá trị giống của dòng lợN ĐỰc vcn03 luậN Án tiến sĩ NÔng nghiệp hà NỘI 2014
downloadfile5 -> Đề tài báo cáo Thực trạng hoạt động quản trị bán hàng và 1 số giải pháp nhằm nâng cao công tác quản trị bán hàng tại công ty A. D. A
downloadfile5 -> English 12 – Vocabulary + Grammar review cách nhận biết từ loại

tải về 0.58 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   5   6   7   8   9   10   11   12   13




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương