Lấy Ra Dòng Dữ Liệu Đã Thay Đổi Trong Dataset

Các bảng này được quản lý bởi tập hợp Tables của lớp DataSet

5.6.1 Tạo DataSet

a. Cú pháp khai báo

Dim tên_dataset as New DataSet()

b. Các thuộc tính của DataSet


Tên

Mô tả

DataSetName

Tên của DataSet. (đọc ghi)

HasErrors

Giá trị cho biết có lỗi xảy ra trên một trong các bảng của DataSet: True/False (chỉ đọc)

Relations

Tập hợp các quan hệ (DataRelation) một nhiều của DataSet. (chỉ

đọc)

Tables

Tập hợp các bảng (DataTable) của DataSet. (chỉ đọc)

Có thể bạn quan tâm!

Xem toàn bộ 201 trang tài liệu này.


5.6.2. Làm việc với DataSet

a. Thêm một bảng vào DataSet:

Muốn đưa một DataTable (bảng) vào DataSet, chúng ta dùng phương thức Add của tập hợp Tables với các mẫu lệnh dưới đây:

1. <Dataset>.Tables.Add()

Một bảng mới tự động tạo ra với tên mặc nhiên (Table1, Table2,…) và đưa vào tập hợp Tables của DataSet

2. <Dataset>.Tables.Add(<tên bảng>)

Một bảng mới tự động tạo ra với tên là <tên bảng> và đưa vào tập hợp Tables

3. <Dataset>.Tables.Add(<bảng>)

Chú ý: Tên bảng trong DataSet có phân biệt chữ HOA chữ thường. Nghĩa là có thể có 2 bảng tên "table1" và "Table1"

b. Thêm nhiều bảng vào DataSet:

Muốn đưa nhiều bảng vào DataSet, chúng ta dùng phương thức AddRange của tập hợp Tables.

<DataSet>.Tables.AddRange(<mảng DataTable>)

Trong đó <mảng DataTable>: Là một mảng các DataTable đã tạo ra muốn đưa vào DataSet.

c. Xóa bảng khỏi DataSet:

Để xóa một bảng khỏi DataSet, chúng ta dùng các phương thức sau của tập hợp Tables.

1. Xóa <DataTable> khỏi tập hợp Tables của DataSet.

<DataSet>.Tables.Remove(<DataTable>)

2. Xóa <DataTable> có tên là <tên bảng> khỏi tập hợp Tables của DataSet.

<DataSet>.Tables.Remove(<tên bảng>)

3. Xóa <DataTable> có chỉ số là <chỉ số> khỏi tập hợp Tables của DataSet.

<DataSet>.Tables.RemoveAt(<chỉ số>)

Tuy nhiên, bảng có thể đang hiển thị dữ liệu trên Form nên chúng ta cần kiểm tra xem có thể xóa được không với cú pháp:

<DataSet>.Tables.CanRemove(<DataTable>)

Phương thức trả về True có thể xóa, ngược lại là False. Ví dụ:

Dim bang As DataTable = dst.Tables(0)

If dst.Tables.CanRemove(bang) then dst.Tables.Remove(bang)

End If

d. Xóa tất cả các bảng khỏi DataSet

Để xóa tất cả các bảng khỏi DataSet, chúng ta dùng phương thức Clear của tập hợp Tables.

<DataSet>.Tables.Clear()

e. Kiểm tra bảng có thuộc về DataSet

<DataSet>.Tables.Contains(<tên DataTable>)

Phương thức trả về True nếu trong Tables có DataTable có tên <tên DataTable>, ngược lại là False.

f. Lấy chỉ số của bảng

1. <DataSet>.Tables.IndexOf(<tên DataTable>)

Phương thức trả về chỉ số của DataTable có tên <tên DataTable>.

2. <DataSet>.Tables.IndexOf(<DataTable>)

Phương thức trả về chỉ số của <DataTable>.

g. Lấy số bảng chứa trong DataSet

<DataSet>.Tables.Count

h. Để kiểm tra dữ liệu của DataSet có thay đổi

1. <DataSet>.HasChanges()

Phương thức kiểm tra sự thay đổi của tất cả các dòng dữ liệu trên các bảng (thêm mới, xóa bỏ, sửa đổi) và trả về True nếu có, ngược lại False.

2. <DataSet>.HasChanges(<trạng thái dòng>)

Phương thức kiểm tra sự thay đổi của tất cả các dòng dữ liệu trên các bảng có trạng thái như <trạng thái dòng> và trả về True nếu có, ngược lại False..

i. Lấy ra dòng dữ liệu đã thay đổi trong DataSet

1. <DataSet>.GetChanges()

Phương thức trả về bản sao của DataSet gồm những dòng dữ liệu đã bị thay đổi trên các bảng (do thêm mới, xóa bỏ, sửa đổi).

2. <DataSet>.GetChanges(<trạng thái dòng>)

Phương thức trả về bản sao của DataSet gồm những dòng dữ liệu đã bị thay đổi có trạng thái như <trạng thái dòng>.

Ví dụ:

Dim ds As DataSet

If dst.HasChanges() then ds = dst.GetChanges()

If dst.HasChanges(DataRowState.Modified) then ds = dst.GetChanges(DataRowState.Modified)

End If

j. Để cập nhật các thay đổi trên DataSet

<DataSet>.AcceptChanges()

Phương thức cập nhật các thay đổi kể từ lúc lấy dữ liệu về hoặc từ lần gọi AcceptChanges trước.

Trên DataTable, DataRow cũng có phương thức tương ứng. Khi gọi AcceptChanges của DataSet sẽ kéo theo gọi AcceptChanges của DataTable, đến lượt kéo theo gọi AcceptChanges của DataRow.

k. Để hủy bỏ các thay đổi trên DataSet:

<DataSet>.RejectChanges()

Phương thức này của DataSet phục hồi tất cả các thay đổi kể từ lúc lấy dữ liệu về hoặc từ lần gọi AcceptChanges trước.

Khi gọi RejectChanges của DataSet sẽ kéo theo gọi RejectChanges của DataTable, DataRow.

l. Để trộn dữ liệu bên ngoài vào DataSet

Dữ liệu bên ngoài có thể là các dòng (mảng dòng), DataTable hoặc một DataSet

khác.

Nguyên tắc của phương thức này như sau: khi được gọi, cấu trúc của nguồn và

đích được so sánh với nhau. Nếu cấu trúc dữ liệu bên ngoài khác với cấu trúc của

DataSet do thêm cột, các cột mới sẽ được thêm vào DataSet (tùy cú pháp) cùng với dữ liệu. Trên dữ liệu bên ngoài, những dòng có tình trạng Unchanged, Modified và Deleted phải có cột khóa chính như những dòng đã có trên DataSet. Những dòng có tình trạng Added (thêm mới) phải thỏa ràng buộc về khóa chính của DataSet.

Trong quá trình trộn lẫn dữ liệu, các ràng buộc được bỏ qua: thuộc tính EnforceConstraints có giá trị False. Cuối quá trình, nếu ràng buộc nào không thể chuyển lại True sẽ làm phát sinh một Exception. Vì vậy, chúng ta cần giải quyết các vi phạm ràng buộc trước khi gán EnforceConstraints với giá trị True.

Phương thức này có rất nhiều cách sử dụng.

1. <DataSet>.Merge(<mảng dòng>)

Trộn một mảng các dòng vào DataSet.

2. <DataSet>.Merge(<DataTable>)

Trộn một DataTable bên ngoài vào DataSet.

3. <DataSet>.Merge(<DataSet>)

Trộn một Dataset bên ngoài vào DataSet.

4. <DataSet>.Merge(<DataSet>,<giữ thay đổi>)

Trộn một Dataset bên ngoài và cấu trúc của nó vào DataSet.

<giữ thay đổi>: nếu là True, các thay đổi từ bên ngoài được giữ nguyên trên DataSet, là False không thay đổi theo bên ngoài.

5. <DataSet>.Merge(<DataSet>,<giữ thay đổi>, _

<xử lý khi cấu trúc khác nhau>)

Trộn một Dataset bên ngoài và cấu trúc của nó vào DataSet.

<xử lý khi cấu trúc khác nhau>: tùy theo giá trị truyền vào.

6. <DataSet>.Merge(<mảng dòng>,<giữ thay đổi>,_

<xử lý khi cấu trúc khác nhau>)

Trộn một mảng dòng bên ngoài và cấu trúc của nó vào DataSet.

7. <DataSet>.Merge(<DataTable>,<giữ thay đổi>, _

<xử lý khi cấu trúc khác nhau>)

Tên

Mô tả

Add

Nếu khác nhau, thêm các cột mới vào cấu trúc của DataSet.

Error

Nếu khác nhau phát sinh lỗi.

Ignore

Nếu khác nhau, bỏ qua các cột mới.

Trộn một DataTable bên ngoài và cấu trúc của nó vào DataSet. Các giá trị của <xử lý khi cấu trúc khác nhau> được mô tả như sau:

m. Để hủy bỏ DataSet

<DataSet>.Dispose()

Khi được gọi, mọi tài nguyên trên vùng nhớ mà DataSet đang sử dụng sẽ được giải phóng.

n. Để tạo một quan hệ giữa hai bảng trong DataSet:

Để thiết lập quan hệ cha-con giữa hai bảng (DataTable) trong một DataSet, phải thỏa yêu cầu sau:

Field hoặc các Field của bảng cha trong quan hệ phải thỏa yêu cầu tính duy

nhất.


Chỉ có thể thiết lập quan hệ giữa hai bảng trong cùng DataSet

Chúng ta sử dụng phương thức Add của tập hợp Relations trong DataSet với các

cú pháp sau.

1. <DataSet>.Relations.Add(<đối tượng DataRelation>)

<đối tượng DataRelation>: đối tượng này phải được tạo sẵn sẽ đề cập ở phần sau

2. <DataSet>.Relations.Add(<DataColumn trên bảng cha>, <DataColumn trên bảng con>)

<DataColumn trên bảng cha>, <DataColumn trên bảng con>: Các đối tượng này thuộc lớp DataColumn sẽ đề cập ở phần sau là các cột tham gia quan hệ trên bảng cha và bảng con tương ứng

3. <DataSet>.Relations.Add(<mảng DataColumn trên bảng cha>, <mảng DataColumn trên bảng con>)

<mảng DataColumn trên bảng cha>, <mảng DataColumn trên bảng con>: Các mảng này là mảng các cột tham gia quan hệ trên bảng cha và bảng con tương ứng.

4. DataSet>.Relations.Add(<tên quan hệ>, _

<DataColumn trên bảng cha>, _

<DataColumn trên bảng con>)

5. <DataSet>.Relations.Add(<tên quan hệ>, _

<mảng DataColumn trên bảng cha>, _

<mảng DataColumn trên bảng con>)

6. <DataSet>.Relations.Add(<tên quan hệ>, _

<DataColumn trên bảng cha>, _

<DataColumn trên bảng con>, <tạo ràng buộc>)

7. <DataSet>.Relations.Add(<tên quan hệ>, _

<mảng DataColumn trên bảng cha>, _

<mảng DataColumn trên bảng con>, <tạo ràng buộc>)

Mặc định, khi tạo quan hệ giữa hai bảng, các ràng buộc đồng thời được tạo ra cho trên mỗi bảng như sau:

Ràng buộc duy nhất trên bảng cha dựa vào các cột của bảng cha tham gia vào quan hệ (nếu chưa có)

Ràng buộc khóa ngoại trên bảng con dựa vào các cột trên bảng cha và bảng con trong quan hệ. Tham số <tạo ràng buộc> cho phép chúng ta quy định có tạo ràng buộc hay không: True có tạo, False không tạo.

o. Thêm nhiều quan hệ vào DataSet:

Muốn đưa nhiều quan hệ có sẵn vào DataSet, chúng ta dùng phương thức AddRange của tập hợp Relations.

<DataSet>.Relations.AddRange(<mảng quan hệ>)

<mảng quan hệ>: là một mảng các quan hệ đã tạo ra muốn đưa vào DataSet.

p. Xóa quan hệ khỏi DataSet

Để xóa một quan hệ khỏi DataSet, chúng ta dùng các phương thức sau của tập hợp Relations.

1. <DataSet>.Relations.Remove(<quan h>)

Xóa <quan hệ> khỏi tập hợp Relations của Dataset.

2. <DataSet>.Relations.Remove(<tên quan h>)

Xóa quan hệ có tên là <tên quan hệ> khỏi tập hợp Relations.

3. <DataSet>.Relations.RemoveAt(<chs>)

Xóa quan hệ có chỉ số là <chỉ số> khỏi tập hợp Relations.

Tuy nhiên, quan hệ có thể đang được sử dụng nên chúng ta cần kiểm tra xem có thể xóa được không với cú pháp:

4. DataSet>.Relations.CanRemove(<quan hệ>)

Phương thức trả về True có thể xóa, ngược lại là False.

Để hủy tất cả các quan hệ trong DataSet, chúng ta dùng các phương thức sau của tập hợp Relations:

<DataSet>.Relations.Clear()

q. Kiểm tra quan hệ có thuộc về DataSet:

<DataSet>.Relations.Contains(<tên quan hệ>)

Phương thức trả về True nếu trong Relations có quan hệ tên <tên quan hệ>, ngược lại là False.

5.6.3 Ví dụ minh họa làm việc với DataSet

Ví dụ 5.9: Thiết kế form dùng để xem thông tin sản phẩm. Khi chạy chương

trình form sẽ thể hiện các thông tin như hình dưới đây. Người sử dụng có thể sử dụng các nút đầu, cuối, trước, sau hoặc bấm trực tiếp trên lưới để xem thông tin sản phẩm.


Hướng dẫn tạo form Sử dụng công cụ datagridview để thêm lưới dg1 vào form 1

Hướng dẫn tạo form: Sử dụng công cụ datagridview để thêm lưới dg1 vào form. Các button Đầu, Trước, Sau, Cuối lần lượt có tên là btdau, btt, bta, btc. Các hộp textbox tương ứng với mã sản phẩm là txtmsp; tên sản phẩm là txttensp, đơn giá là txtdg; nhà cung cấp là txtncc.

Trong phần code chúng ta sẽ định nghĩa một đối tượng dataset có tên dst, tầm vực đơn thể class và một đối tượng dataAdapter có tên da1 lấy dữ liệu từ bảng sanpham của cơ sở dữ liệu De1 trên server HTC-VAIOHuyen. Module khai báo kết nối và chuỗi kết nối được tạo như trong ví dụ 5.2b.

Để di chuyển con trỏ bản ghi ta sử dụng lớp có tên là BindingContext của form. BindingContext là đối tượng quản lý các BindingManagerBase. Các đối tượng kế thừa từ lớp Control đều có thể có BindingContext. Tuy nhiên, chỉ có Form và các điều khiển chứa các điều khiển khác như Groupbox, TabControl, Panel mới có thể tạo một BindingContext để quản lý các BindingManagerBase hiển thị dữ liệu của các điều khiển chứa trong nó.

Vị trí của con trỏ bản ghi được xác định hoặc thiết lập thông qua đối tượng Position của BindingContext bằng cách sử dụng một trong hai cú pháp sau:

Me.BindingContext()(datasource).Position

Imports System.Data

Hoặc Me.BindingContext()(datasource,datamember).Position Phần code của form:

Public Class FrmDataSet_1 Dim dst As New DataSet

Private Sub FrmDataSet_1_Load...

Dim lenh As String = "select masp as 'Mã SP', _ tensp as 'Tên SP',dongia as 'Đơn giá', _

nhacc as 'Nhà CC' from sanpham"

Dim da1 As New SqlClient.SqlDataAdapter(lenh, Chuoi_ket_noi) dst.Clear() 'xóa nội dung dataset

da1.Fill(dst, "sanpham") 'đổ DL vào bảng sản phẩm của dst 'khai báo thuộc tính cho lưới dg1

dg1.DataSource = dst dg1.DataMember = "sanpham"

End Sub

Private Sub btdau_Click...

'chuyển con trỏ về bản ghi đầu tiên Me.BindingContext()(dst, "sanpham").Position = 0

End Sub

Private Sub btt_Click ...

'chuyển con trỏ về bản ghi trước Me.BindingContext()(dst, "sanpham").Position -= 1

End Sub

Private Sub bts_Click ...

'chuyển con trỏ về bản ghi tiếp theo Me.BindingContext()(dst, "sanpham").Position += 1

End Sub

Private Sub btc_Click...

'chuyển con trỏ về bản ghi cuối cùng Me.BindingContext()(dst, "sanpham").Position = _ Me.BindingContext()(dst, "sanpham").Count - 1

End Sub

'thủ tục in thông tin của sản phẩm khi thay đổi bản ghi hiện thời Private Sub dg1_SelectionChanged...

Dim dong%

'lấy giá trị dòng hiện thời của lưới dg1 dong = dg1.CurrentCellAddress.Y

'lấy giá trị các ô trên dòng hiện thời của lưới dg1

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 27/12/2023