Tải bản đầy đủ (.pdf) (31 trang)

(TIỂU LUẬN) tiểu luận môn học lập TRÌNH HƯỚNG đối TƯỢNG đề tài tìm HIỂU về ADO NET

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.97 MB, 31 trang )

TRƯỜNG ĐẠI HỌC NGÂN HÀNGTHÀNH PHỐ HỒ CHÍ MINH
KHOA HỆ THỐNG THƠNG TIN QUẢN LÝ
----------

Bài tiểu luận mơn học

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
ĐỀ TÀI:

TÌM HIỂU VỀ ADO.NET
Họ tên sinh viên: Lê Nguyễn Ngọc Hiệp
Mã SV: 030235190043
Lớp: ITS326_211_D03
Giảng viên: Th.S Nguyễn Văn Thọ

Tp Hồ Chí Minh, ngày 16 tháng 11 năm 2021
1

Tieu luan


MỤC LỤC
Lời mở đầu .......................................................................................................................... 3
I.

Giới thiệu về ADO.NET(Active X DataObject .NET): ........................................... 4
1. Khái niệm: ................................................................................................................ 4
2. Đặc điểm: .................................................................................................................. 4
3. Các thư viện truy xuất CSDL trong ADO.NET ...................................................... 6
4. Những loại ứng dụng nào sử dụng ADO.NET ....................................................... 7


II.

Kiến trúc ADO.NET: .............................................................................................. 7

1. Data Provider: .......................................................................................................... 8
2. DataSet: ................................................................................................................... 15
III.

Kết nối ADO.NET với các cơ sở dữ liệu: ............................................................ 23

1. ADO.NET kết nối với SQL Server Database ......................................................... 23
2. ADO.NET kết nối với Oracle Database ................................................................. 23
IV.

Thao tác SQL Server với C# [ADO.NET]........................................................... 24

1. Truy xuất dữ liệu từ SQL Server bằng ADO.NET: .............................................. 24
2. Thêm dữ liệu vào SQL Server bằng ADO.NET .................................................... 25
3. Xóa dữ liệu khỏi SQL Server bằng ADO.NET ..................................................... 26
V. Data Source Configuration Wizard ........................................................................ 27
VII. Tổng kết .................................................................................................................. 30
TÀI LIỆU KHAM KHẢO ............................................................................................. 31

2

Tieu luan


Lời mở đầu
Trước khi .NET xuất hiện thì mơ hình được sử dụng để kết nối là ADO (ActiveX

Data Object). Với sự ra đời của .NET thì ADO.NET cũng được phát triển để có thể giúp
lập trình viên viết ứng dụng làm việc với các nguồn dữ liệu dễ dàng hơn và thống nhất
hơn nhờ việc sử dụng chung các kiểu dữ liệu, các mẫu thiết kế (design pattern) và các
quy tắc đặt tên. ADO.NET được thiết kế với các tính năng: kiến trúc dữ liệu khơng kết
nối (disconnected data architecture), tích hợp với XML, và được tối ưu để kết nối với cơ
sở dữ liệu (và các nguồn dữ liệu khác). Mặc khác, mơ hình lập trình ADO.NET cũng khá
giống ADO, do đó rút ngắn thời gian tìm hiểu cho những ai đã sử dụng qua ADO trong
quá khứ.
Trong thực tế, có rất nhiều ứng dụng cần tương tác với cơ sở dữ liệu. .NET
Framework cung cấp một tập các đối tượng cho phép truy cập vào cơ sở dữ liệu, tập các
đối tượng này được gọi chung là ADO.NET. Với kiến trúc này, người dùng có thể thao
tác trên dữ liệu họ nhận về và chỉ kết nối đến cơ sở dữ liệu khi họ cần thay đổi các dòng
dữ liệu hay yêu cầu dữ liệu mới. Việc kết nối không liên tục đến cơ sở dữ liệu đã đem lại
nhiều thuận lợi, trong đó điểm lợi nhất là việc giảm đi một lưu lượng lớn truy cập vào cơ
sở dữ liệu cùng một lúc, tiết kiệm đáng kể tài nguyên bộ nhớ. Giảm thiểu đáng kể vấn đề
hàng trăm ngàn kết nối cùng truy cập vào cơ sở dữ liệu cùng một lúc.
Trong quá trình thực hiện bài tiểu luận với đề tài “Tìm hiểu về ADO.NET” đã
giúp em phần nào nắm được những phần cơ bản về ADO.NET. Phần trình sau đây sẽ làm
rõ hơn về ADO.NET và các vấn đề liên quan: Tổng quan về ADO.NET, kiến trúc các
thành phần, các thao tác, v.v…

3

Tieu luan


I. Giới thiệu về ADO.NET(Active X DataObject .NET):
Đây là một nhà phát triển .NET bao gồm các thư viện được cung cấp bởi Microsoft.
Nếu bạn theo lập trình Winform bằng C# hoặc lập trình web bằng cơng nghệ .NET thì
chắc chắ sẽ đụng đến thư viện này. Nó được xem là cốt lõi của công nghệ .NET, giúp kết

nối với database, xử lý truy vấn database và trả kết quả về cho người dùng.
1. Khái niệm:
ADO.NET là một bộ các thư viện hướng đối tượng (OOP) cho phép bạn tương tác với
dữ liệu nguồn. Thơng thường thì dữ liệu nguồn là một cơ sở dữ liệu (database) như là
SQL Server, Oracle, MySQL, nhưng nó cũng có thể là file text, exel hoặc XML.
ADO.NET bao gồm một tập hợp các lớp có thể được sử dụng để kết nối, truy xuất, chèn
và xóa dữ liệu khỏi nguồn dữ liệu. ADO.NET chủ yếu sử dụng System.Data.dll và
System.Xml.dll.
2. Đặc điểm:
– ADO.NET là một phần của .NET Framework
– Thư viện lớp có chức năng thao tác dữ liệu trong ngôn ngữ MS.NET
– ADO.NET là dạng “Disconnected” Cho phép lấy cả một cấu trúc phức tạp của dữ
liệu từ cơ sở dữ liệu, sau đó ngắt kết nối rồi mới thực hiện thao tác xử lý và ADO
ln phải duy trì kết nối trong suốt quá trình làm việc.
4

Tieu luan


 Mơi trường “connected” : Mỗi user có một kết nối cố định tới data source là những
đối tượng giao tiếp trực tiếp với CSDL.
 Ưu điểm:
+ Môi trường được bảo vệ tốt
+ Kiểm soát được sự đồng bộ
+ Dữ liệu ln được mới
 Nhược điểm:
+ Phải có một kết nối mạng cố định
+ Khả năng mở rộng
 Môi trường “disconnected”:
Một tập con của dữ liệu trung tâm được sao chép và bổ sung độc lập, sau đó sẽ được hợp

nhất lại vào dữ liệu trung tâm. Cho phép các user làm việc với dữ liệu dạng offline (khi
đã đóng kết nối cơ sở dữ liệu)
 Ưu điểm
+ Có thể làm việc bất cứ lúc nào, cũng như có thể kết nối bất kỳ vào Data Source
+ Cho phép user khác có thể kết nối
+ Nâng cao hiệu suất thực hiện của ứng dụng
 Nhược điểm:
+ Dữ liệu không được cập nhật một cách nhanh nhất
+ Sự tranh chấp có thể xuất hiện và phải giải quyết
– Kế thừa các ưu điểm của ADO kết hợp với ý tưởng thiết kế hoàn toàn mới
+ Dựa vào XML: Chuẩn giao tiếp dữ liệu phổ biến nhất trên môi trường Internet
hiện nay
+ Hướng đối tượng: Đặc trưng của thư viện .NET Framework
Đặc điểm
Data xử lý được

ADO
Recordset : tương đương 1 bảng
dữ liệu trong database

ADO.NET
Dataset : tương đương 1 database

5

Tieu luan


đưa vào bộ nhớ
dưới dạng


Duyệt dữ liệu

Dữ liệu ngắt kết
nối

Recordset chỉ cho phép duyệt tuần
tự, từng dòng một.
Recordset thiên về hướng kết nối,
nên việc hỗ trợ ngắt kết nối không
mạnh

Dataset : duyệt “tự do, ngẫu
nhiên”, truy cập thẳng tới bảng,
dòng, cột mong muốn.
Dataset hỗ trợ hoàn toàn ngắt kết
nối
ADO.NET trao đổi dữ liệu qua

Trao đổi dữ liệu
qua Internet

Khả năng trao đổi dữ liệu ADO

Internet rất dễ dàng vì DO.NET

qua Internet thường có nhiều hạn

được thiết kế theo chuẩn XML, là


chế. Do dùng chuẩn COM

chuẩn dữ liệu chính được sử dụng
để trao đổi trên Internet.

3. Các thư viện truy xuất CSDL trong ADO.NET
Như bạn có thể biết rằng, có rất nhiều loại database hiện nay như Microsoft SQL
Server, Microsoft Access, Oracle, Borland Interbase, và IBM DB2,… và các thư viện
truy xuất cụ thể
 Ví dụ:
+

System.Data.OleDb: Access, SQL Server, Oracle

+ System.Data.SqlClient: SQL Server
+ System.Data.OracleClient: Oracle
 Ghi chú:
+ Về mặt giao tiếp lập trình ứng dụng, cả 3 thư viện trên khơng khác biệt nhau
nhiều.
+ Dùng thư viện System.Data.SqlClient sẽ truy xuất SQL Server nhanh hơn
System.Data.OleDb

6

Tieu luan


+ Dùng thư viện System.Data.OracleClient sẽ truy xuất Oracle nhanh hơn
System.Data.OleDb
4. Những loại ứng dụng nào sử dụng ADO.NET

ADO.NET có thể được sử dụng để phát triển bất kỳ loại ứng dụng .NET nào. Sau đây là
một số ứng dụng .NET mà bạn có thể sử dụng cơng nghệ truy cập dữ liệu ADO.NET để
tương tác với nguồn dữ liệu.
 ASP.NET Web Form Applications
 Windows Applications
 ASP.NET MVC Applications
 Console Applications
 ASP.NET Web API Applications
II.

Kiến trúc ADO.NET:

Các thành phần của ADO.NET được thiết kế để thao tác dữ liệu và truy cập nhanh vào dữ
liệu. Connecton, Command, DataReader, DataAdapter, DataSet và DataView là các

7

Tieu luan


thành phần của ADO.NET được sử dụng để thực hiện các hoạt động cơ sở dữ liệu.
ADO.NET có hai thành phần chính được sử dụng để truy cập và thao tác dữ liệu như sau:
 Data Provider
 DataSet
1. Data Provider:
Các .NET Framework data providers cung cấp đối tượng hỗ trợ cho việc mở kết nối
tới các cơ sở dữ liệu, cơ sở dữ liệu không thể thực thi trực tiếp code C# của chúng ta, nó
chỉ hiểu SQL. Vì vậy, nếu ứng dụng .NET muốn truy xuất dữ liệu hoặc thực hiện một số
thao tác chèn, cập nhật, xóa từ ứng ứng vào CSDL thì cần:
 Kết nối với CSDL.

 Chuẩn bị câu lệnh SQL.
 Thực hiện lệnh.
 Lấy kết quả và hiển thị chúng trong ứng dụng.
Phần kết nối: sử dụng khi kết nối CSDL và thao tác dữ liệu, phải thực hiện kết nối khi
thao tác
 Connection: quản lý việc đóng mở DataBase
+ ConnectionString: loại Data Source cần kết nối.
+ Open(): thiết lập kết nối đến Data Source.
+ Close(): ngắt kết nối đến Data Source
– Sau đây là một số phương thức quan trọng của SqlConnection:
+ BeginTransaction: Nó được sử dụng để bắt đầu một transaction với cơ sở dữ liệu
và trả về một đối tượng đại diện cho transaction mới.
+ ChangeDatabase(string database): Nó được sử dụng để thay đổi cơ sở dữ liệu
hiện tại cho một SqlConnection đang mở.

8

Tieu luan


+ ChangePassword(string connectionString, string newPassword): Thay đổi mật
khẩu SQL Server cho người dùng được chỉ định trong chuỗi kết nối thành mật
khẩu mới được cung cấp.
+ Close(): Nó được sử dụng để đóng kết nối với cơ sở dữ liệu. Đây là phương pháp
tối ưu nhất để đóng bất kỳ kết nối nào đang mở.
+ CreateCommand(): Nó tạo và trả về một đối tượng
System.Data.SqlClient.SqlCommand được liên kết với
System.Data.SqlClient.SqlConnection.
+ GetSchema(): Nó trả về thong tin lược đồ cho nguồn dữ liệu của
System.Data.SqlClient.SqlConnection.

+ Open(): Phương thức này được sử dụng để mở một kết nối cơ sở dữ liệu với cài
đặt thuộc tính được chỉ định bởi
System.Data.SqlClient.SqlConnection.ConnectionString.
 SQL:
SqlConnection cnn = new SqlConnection();
cnn.ConnectionString = “server= .\\SQLEXPRESS;
database=DataBase; Trusted_Connection=true”;
cnn.Open();
//xử lý trong quá trình kết nối

cnn.Close();

+ servername: Là tên của server hoặc địa chỉ IP của máy mà bạn muốn kết nối đến,
nếu server đó chính là máy của bạn thì có thể thay bằng "server=.".
+ databasename: Là tên của database mà bạn chọn để kết nối trong server đã khai
báo trước đó.
+ integrated security = true: Ở đây sử dụng quyền truy cập của window để truy cập
vào SQL Server.
 ORACLE:

9

Tieu luan


OleDbConnection cnn = new OleDbSqlConnection();
cnn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;
Data Source =Sinhvien.mdb”;
cnn.Open();
//xử lý trong quá trình kết nối …

cnn.Close();

 Command: lệnh truy vấn, tương tác dữ liệu khi đang lập kết nối
ADO.NET SqlCommand trong C# được sử dụng để lưu trữ và thực thi câu lệnh SQL
dựa trên cơ sở dữ liệu SQL Server. Class SqlCommand là một lớp được kế thừa từ class
DbCommand và triển khai interface ICloneable.
– SqlCommand trong C# cung cấp các Thuộc tính sau:
+ Connection: kết nối để thực hiện lệnh
+ CommandText: câu lệnh cần thực hiện
+ CommandType: loại câu lệnh (Text,TableDirect, StoredProc)
+ tác động (Insert, Update, Delete…)
– SqlCommand trong C# cung cấp các phương thức sau.
+ BeginExecuteNonQuery(): Phương thức này bắt đầu thực thi không đồng bộ
câu lệnh Transact-SQL hoặc thủ tục được lưu trữ mô tả bởi
System.Data.SqlClient.SqlCommand này.
+ Cancel(): Phương thức này được dùng để hủy bỏ việc thực thi
System.Data.SqlClient.SqlCommand.
+ Clone(): Phương thức này tạo một đối tượng
System.Data.SqlClient.SqlCommand mới, là bản sao của bản hiện tại.
+ CreateParameter(): Phương thức này tạo mới một đối tượng
System.Data.SqlClient.SqlParameter.
+ ExecuteReader(): Phương thức này gửi
System.Data.SqlClient.SqlCommand.CommandText tới
System.Data.SqlClient.SqlCommand.Connection và xây dựng một
System.Data.SqlClient.SqlDataReader.
10

Tieu luan



+ ExecuteScalar(): Phương thức này thực hiện truy vấn và trả về cột đầu tiên
của hàng đầu tiên trong tập kết quả đưuọc trả về bởi truy vấn.
+ ExecuteNonQuery(): Phương thức này thực thi một câu lệnh Transact-SQL và
trả về số hàng bị ảnh hưởng.
+ Prepare(): Phương thức này tạo một phiên bản chuẩn bị của lệnh trên một
phiên bản của SQL Server.
+ ResetCommandTimeOut(): Phương thức này đặt lại thuộc tính
CommandTimeOut về giá trị mặc định của nó.
Ví dụ:
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data source=.\\SQLEXPRESS;"+
"Initial Catalog=StudentDB; Integrated security=yes;
StudentDB ";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = // các lệnh xử lý
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

– Tham số hóa câu lệnh: Một câu lệnh được sử dụng nhiều lần
cmd.CommandText = "Insert into Sinhvien
values(@MS,@HT,@NS,@GT,@DC,@DT)";
cmd.Parameters.Add("@MS", SqlDbType.Int);
cmd.Parameters.Add("@HT", SqlDbType.NVarChar);
cmd.Parameters.Add("@NS",SqlDbType.DateTime);
cmd.Parameters.Add("@GT",SqlDbType.Bit);
cmd.Parameters.Add("@DC",SqlDbType.NVarChar);
cmd.Parameters.Add("@DT",SqlDbType.Int);
cmd.Parameters["@MS"].Value = 999;

11

Tieu luan


cmd.Parameters["@HT"].Value = "Nguyen Ha Giang";
cmd.Parameters["@NS"].Value = new DateTime(1978,12,4);
cmd.Parameters["@GT"].Value = 1;
cmd.Parameters["@DC"].Value = “Tan Binh";
cmd.Parameters["@DT"].Value = 5120791;
conn.Open();
int count = (int) cmd.ExecuteNonQuery();
conn.Close();

 DataReader: đọc dữ liệu, chỉ xử lý 1 dòng dữ liệu tại một thời điểm
SqlDataReader trong C# được sử dụng để đọc dữ liệu từ cơ sở dữ liệu SQL Server
theo cách hiệu quả nhất. Nó đọc dữ liệu từ forward-only stream. Nghĩa là, khi nó đọc
một bản ghi, nó sẽ đọc bản ghi tiếp theo, khơng có cách nào để quay lại và đọc bản
ghi trước đó. SqlDataReader là một connection-oriented. Nó yêu cầu một kết nối mở
hoặc đang hoạt động với nguồn dữ liệu trong khi đọc dữ liệu. SqlDataReader ở chế độ
read-only. Có nghĩa là cũng khơng thể thay đổi dữ liệu bằng SqlDataReader, vì vậy
bạn cũng cần đóng và mở kết nối một cách rõ ràng.
– SqlDataReader cung cấp các thuộc tính sau.
+ Connection: Nhận System.Data.SqlClient.SqlConnection được liên kết với
System.Data.SqlClient.SqlDataReader.
+ Depth: Nhận một giá trị cho biết depth (độ sâu) của hàng hiện tại.
+ FieldCount: Lấy số cột trong hàng hiện tại
+ HasRows: Nhận một giá trị cho biết liệu
System.Data.SqlClient.SqlDataReader có chứa một hay nhiều hay khơng.
+ IsClosed: Truy xuất một giá trị Boolean cho biết liệu phiên bản

System.Data.SqlClient.SqlDataReader được chỉ định đã chị đóng hay chưa.
+ RecordsAffected: Nhận được số lượng hàng được thay đổi, chèn hoặc xóa
bằng cách thực hiện câu lệnh T-SQL.

12

Tieu luan


+ VisibleFieldCount: Lấy số lượng trường trong
System.Data.SqlClient.SqlDataReader không bị ẩn.
+ Item[String]:Nhận giá trị của cột được chỉ định ở định dạng gốc của nó với
tên cột.
+ Item[Int32]: Nhận giá trị của cột được chỉ định ở định dạng gốc của nó theo
thứ tự cột
– SqlDataReader cung cấp các phương thức sau:
+ Close(): Được sử dụng để đóng đối tượng SqlDataReader.
+ GetBoolean (int i): Nhận giá trị của cột được chỉ định dưới dạng Boolean.
+ GetByte(int i): Nhận giá trị của cột được chỉ định dưới dạng byte.
+ GetChar(int i): Nhận giá trị của cột được chỉ định dưới dạng một ký tự duy
nhất.
+ GetDateTime(int i): Nhận giá trị của cột được chỉ định dưới dạng đối tượng
System.DataTime.
+ GetDecimal(int i): Nhận giá trị của cột được chỉ định dưới dạng đối tượng
System.Decimal.
+ GetDouble(int i): Nhận giá trị của cột được chỉ định dưới dạng số dấu phẩy
động, có độ chính xác double.
+ GetFloat(int i): Nhận giá trị của cột được chỉ định dưới dạng số dấu phẩy
động có độ chính xác single.
+ GetName(int i): Lấy tên của cột được chỉ định.

+ GetSchemaTable(): Trả về một System.Data.Table mô tả metadate column
của System.Data.SqlClient.SqlDataReader.
+ GetValue(int i): Nhận giá trị của cột được chỉ định ở định dạng gốc của nó.
+ NextResult(): Nâng cao trình đọc dữ liệu đến kết quả tiếp theo khi đọc kết quả
của các câu lệnh T-SQL.
+ Read(): Được sử dụng để đọc các bản ghi, trả về true nếu có nhiều hơn một
hàng và ngược lại là false.

13

Tieu luan


SqlCommand cmd = new SqlCommand("Select *
From Sinhvien", conn);
SqlDataReader reader;
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
listBox1.Items.Add(reader["Hoten"]);
reader.Close();
conn.Close();

 DataAdapter: cầu nối giữa DB và DataSet
SqlDataAdapter trong C# hoạt động như một cầu nối giữa DataSet và nguồn dữ liệu (Cở
sở dữ liệu SQL Server) để truy xuất dữ liệu. SqlDataAdapter là một lớp đại diện cho một
tập hợp các câu lệnh SQL và một kết nối cơ sở dữ liệu. Nó có thể được sử dụng để điền
vào DataSet và cập nhật nguồn dữ liệu.
– SqlDataAdapter cung cấp các phương thức sau.
+ CloneInternals(): Được sử dụng để tạo một bản sao của bản DataAdapter hiện

tại.
+ Dispose(Boolean): Được sửu dụng để giải phóng các tài ngun khơng được
quản lý được sử dụng bởi DataAdapter.
+ Fill(Data Set): Được sử dụng để thêm các hàng trong DataSet sao cho khớp với
các hàng trong nguồn dữ liệu.
+ FillSchema(DataSet, SchemaType, String, IDataReader): Được sử dụng để
thêm một DataTable vào DataSet được chỉ định.
+ GetFillParameters(): Được sử dụng để lất các tham số do người dùng thiết lập
khi thực thi câu lệnh SQL Select.
+ ResetFillLoadOption(): Được sử dụng để đặt lại FillLoadOption về trạng thái
mặc định của nó.

14

Tieu luan


+ ShouldSerializeFillLoadOption(): Xác định xem thuộc tính FillLoadOption có
nên được duy trì hay khơng.
+ ShouldSerializeTableMappings(): Xác định liệu một hoặc nhiều đối tượng
DataTableMapping có tồn tại hay khơng.
+ Update(DataSet): Được sử dụng để gọi các câu lệnh Insert, Update hoặc Delete
tương
Ví dụ:
string strConn="Server=.\\SQLEXPRESS; Database=StudentDB;
Trusted_connection=true";
SqlDataAdapter adapter = new
SqlDataAdapter("Select * From Sinhvien", strConn);
DataSet ds = new DataSet();
adapter.Fill(ds);

// thao tác trên dataset

adapter.Update(ds);

2. DataSet:
DataSet đại diện cho một tập hợp con của cơ sở dữ liệu trong bộ nhớ. Hay nói cách
khác, DataSet là một tập hợp các bảng dữ liệu có chứa dữ liệu quan hệ trong bộ nhớ ở
định dạng bảng (table). DataSet không dành riêng cho một Data Provider (nhà cung cấp)
nào cả. Khi bạn kết nối với cơ sở dữ liệu, hãy thực thi lệnh và truy xuất dữ liệu vào ứng
dụng .NET. Dữ liệu sau đó có thể được lưu trữ trong DataSet và hoạt động độc lập với cơ
sở dữ liệu. Vì vậy, nó được sử dụng để truy cập dữ liệu độc lập từ bất kỳ nguồn dữ liệu
nào. DataSet chứa một tập hợp một hoặc nhiều đối tượng trong DataTable.
DataSet và các lớp liên quan tới nó như DataRow, DataTable, DataView dùng cho
việc lưu trữ dữ liệu của cơ sở dữ liệu sau khi thực thi các câu lệnh của .NET Framework
data providers và các dữ liệu này của DataSet thông thường được lưu trữ trên RAM của
bộ nhớ. Là phần cơ sở dữ liệu được lưu trữ trong bộ nhớ (in-memory database)

15

Tieu luan


DataSet có các thành phần con như: DataTable, DataRow, DataColumn,
DataRelation
Các đối tượng nhóm: DataTableCollection,DataRowCollection, DataColumnCollection
– Cơ chế khơng kết nối: Nhờ đối tượng DataAdapter làm trung gian, hỗ trợ đầy đủ
đặc tính XML, thao tác được với tất cả mơ hình lưu trữ hiện tại:
 Flat file database: plain text, mixed text, binary text
 Relational database.
 Hierarchical: data is organized into a tree-like structure

DataSet:
Type

Name

DataTableCollection

Tables

Description
Nhận tập hợp các bảng có trong
System.Data.DataSet
Nhận tập hợp các quan hệ liên kết các bảng và

DataRelationCollection

Relations

cho phép điều hướng từ bảng cha sang bảng
con.

DataColumnCollection

Columns

Nhận tập hợp các cột thuộc bảng này.

DataRowCollection

Rows


Nhận tập hợp các hàng thuộc bảng này.

ConstraintCollection

Constraints

Nhận tập hợp các ràng buộc được duy trì bởi
bảng này.

– Các thuộc tính của DataSet trong ADO.NET.
+ CaseSensitive: Được sử dụng để lấy hoặc đặt một giá trị cho biết liệu các so
sánh chuỗi trong các đối tượng System.Data.DataTable có phân biệt chữ hoa
hoặc chữ thường hay khơng. Nó trả về true nếu các so sánh chuỗi là chữ hoa
hoặc chữ thường, ngược lại là false (mặc định là false).

16

Tieu luan


+ DefaultViewManager: Được sử dụng để có thể xem được chế độ tùy chỉnh dữ
liệu có trong System.Data.Set để cho phép lọc, tìm kiếm và điều hướng bằng
cách sử dụng System.Data.DataViewManager tùy chỉnh.
+ DataSetName: Được sử dụng để lấy hoặc đặt trên của System.Data.DataSet
hiện tại.
+ EnforceConstraints: Được sử dụng để lấy hoặc đặt một giá trị cho biết liệu
các quy tắc ràng buộc có được tuân theo khi thực hiện bất kỳ thao tác cập nhật
nào hay không.
+ HasErrors: Được sử dụng để nhận một giá trị cho biết liệu có lỗi trong bất kì

đối tượng DataTable nào trong DataSet này hay không.
+ IsInitialized: Được sử dụng để nhận một giá trị cho biết liệu DataSet có được
khởi tạo hay khơng. Nó trả về true để cho biết thành phần đã được khởi tạo,
ngược lại là false.
+ Prefix: Được sử dụng để lấy hoặc đặt một tiền tố XML làm bí danh cho
namespace System.Data.DataSet.
+ Locale: Được sử dụng để lấy hoặc đặt thông tin ngôn ngữ cho việc so sánh các
chuỗi trong bảng.
+ Namespace: Được sử dụng để lấy hoặc đặt tên namespace của
System.Data.DataSet.
+ Site: Được sử dụng dể lấy hoặc thiết lập một System.ComponentModel.ISite
cho System.Data.DataSet.
+ Relations: Được sử dụng để lấy tập hợp các quan hệ liên kết các bảng và cho
phép điều hướng từ bảng mẹ sang bảng con.
+ Tables: Được sử dụng để lấy tập hợp các bảng có trong System.Data.DataSet.
– Các phương thức của DataSet trong ADO.NET.
+ BeginInit(): Nó bắt đâu khởi tạo System.Data.DataSet được sử dụng trên một
biểu mẫu hoặc được sử dụng bởi một component khác. Quá trình khởi tạo này
xảy ra tại thời điểm bắt đầu chạy.

17

Tieu luan


+ Clear(): Xóa DataSet của bất kỳ dữ liệu nào, bằng cách xóa tất cả các hàng
trong tất cả các bảng.
+ Clone(): Sao chép cấu trúc của DataSet, bao gồm tất cả các Schema, quan hệ
và ràng buộc DataTable. Nhưng ngược lại nó sẽ khơng sao chép bất kỳ dữ liệu
nào.

+ Copy(): Sao chéo cả cấu trúc và dữ liệu của DataSet được chọn.
+ CreateDataReader(): Trả về một DataTableReader với một tập kết quả cho
mỗi DataTable, theo trình tự giống như các bảng xuất hiện trong
System.Data.DataSet.Tables.
+ CreateDataReader(params DataTable[] dataTables): Trả về một
System.Data.DataTableReader với một tập kết quả cho mỗi
System.Data.DataTable.
+ EndInit(): Nó kết thúc việc khởi tạo DataSet, được sử dụng trên một biễu mẫu
hoặc được sử dụng bởi một component khác.
+ GetXml(): Trả về biểu diễn XML của dữ liệu được lưu trữ trong DataSet.
+ GetXmlSchema(): Trả về Schema XML cho biểu diễn XML của dữ liệu được
lưu trữ trong DataSet.
 Nạp dữ liệu vào DataSet từ database:
Phương thức sau sẽ kết nối đến database SQL Server, sau đó nạp hai table User và Group
vào DataSet.
private static DataSet LoadData()
{
var conn = new SqlConnection(
"Server=;Database=YinYangDB;Trusted_Connection=true");
conn.Open();
var cmd = "Select * from Users";
var dataAdapter = new SqlDataAdapter(cmd, conn);
var dataSet = new DataSet();
dataAdapter.Fill(dataSet, "User");
18

Tieu luan


dataAdapter.SelectCommand.CommandText = "Select * from

Groups";
dataAdapter.Fill(dataSet, "Group");
conn.Close();
return dataSet;
}

Phương thức Fill(DataSet) của DataAdapter tự động lấy tên bảng mà bạn đặt trong
CommandText để đặt tên cho DataTable, tuy nhiên để chắc chắn tên bảng đúng trong
trường hợp có sửa đổi, tơi dùng overload Fill(DataSet,string) để đặt tên lại cho các table.
Thay vì Fill() vào DataSet, bạn có thể dùng Fill(DataTable) để tạo ra một DataTable
mới, sau đó thêm vào DataSet:
var table=new DataTable("Group");
dataAdapter.Fill(table);
dataSet.Tables.Add(table);

Một số tên table có thể trùng với từ khóa mà SQL sử dụng (ví dụ: User), mặc dù điều
này ít khi xảy ra nhưng bạn có thể đề phịng trước bẳng cách sử dụng quy tắc đặt tên như
sử dụng tiền tố, đặt tên theo danh từ số nhiều,…Ngoài cách nạp dữ liệu từ datatable, bạn
cũng có thể tạo dữ liệu động cho DataTable thông qua các collection Columns và Rows.
 Tạo dữ liệu động cho DataTable
Kiểu dữ liệu DataColumn chứa đầy đủ các property cần thiết để bạn tạo ra một mơ
hình dữ liệu hồn chỉnh cho DataTable. Ta có thể tạo một column dùng làm ID với chỉ số
tự động tăng bắt đầu từ 1, không cho phép null và là duy nhất như sau:
DataColumn col = new DataColumn("ID", typeof(int));
col.AllowDBNull = false;
col.AutoIncrement = true;
col.AutoIncrementSeed = 1;
col.Unique = true;

19


Tieu luan


Các DataColumn cần thiết phải có hai thơng tin là tên và kiểu dữ liệu. Khi đã có một
DataTable rỗng, cơng việc thêm các DataColumn vào rất đơn giản.
Ví dụ: Tạo một DataTable với tên Persons với ba column là ID, Name và Birthday
cùng với kiểu dữ liệu tương ứng là int, string và DateTime:
DataTable table = new DataTable("Persons");
DataColumn col = new DataColumn("ID", typeof(int));
col.AllowDBNull = false;
col.AutoIncrement = true;
col.AutoIncrementSeed = 1;
col.Unique = true;
table.Columns.Add(col);
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Birthday", typeof(DateTime));

DataTable của chúng ta vẫn là rỗng vì chưa có dữ liệu (chỉ có mơ hình dữ liệu). Để
tạo một DataRow ta cần gọi phương thức DataTable.NewRow(). Phương thức này trả về
một DataRow với các ô chứa dữ liệu tương ứng với các cột của DataTable. Công việc
thêm dữ liệu cũng rất đơn giản, dựa vào hai overload của DataRowCollection.Add() như
bạn thấy dưới đây:
DataRow newRow = table.NewRow();
newRow["ID"] = 1; // remove this line
newRow["Name"] = "Boo";
newRow["Birthday"] = new DateTime(1990,3,4);
table.Rows.Add(newRow);
table.Rows.Add(null, "Bee", new DateTime(1989, 5, 3));


 Tạo DataRelation:

20

Tieu luan


Khi bạn thêm các table vào DataSet thì giữa chúng chưa có relation nào. Để tạo ra
một relation, sử dụng property Relations của DataSet để thêm vào các đối tượng
DataRelation.
Ví dụ:
Sau tạo ra một relation giữa hai table Group, User trong DataSet thông qua cột
GroupID trong mỗi table với tên relation mà tôi đặt là Group_User.
DataSet dataSet = LoadData();
DataTable userTable = dataSet.Tables["User"];
DataTable groupTable = dataSet.Tables["Group"];
DataRelation relation=new DataRelation("Group_User",
groupTable.Columns["GroupID"],
userTable.Columns["GroupID"]);
dataSet.Relations.Add(relation);

 Phương thức GetChildRows():
Sau khi có relation, ta có thể dùng phương thức instance DataRow.GetChildRows()
để lấy về một mảng các DataRow trong bảng con của bảng hiện tại.
DataRow[] groupRows = groupTable.Select("GroupID='1'");
DataRow[] memberRows =
groupRows[0].GetChildRows("Group_User");
foreach (var row in memberRows)
Console.WriteLine(row["UserName"]);


Dòng lệnh đầu tiên của đoạn mã trên lấy về một mảng DataRow bằng phương thức
DataTable.Select(string filterExpression) với tham số là một câu lệnh lọc (giống biểu
thức sau từ khóa “where” trong SQL). Dựa vào dữ liệu, ta biết mảng này thực chất chỉ
chứa một phần tử, chính vì thế ta lấy phần tử đầu tiên của mảng groupRows và gọi
phương thức GetChildRows(string relationName). Và kết quả in ra màn hình sẽ là những
user nằm trong GroupID là 1, tức là “Member”.
21

Tieu luan


 Phương thức GetParentRow():
Ngược với GetChildRows(), phương thức GetParentRow() trả về một DataRow từ
bảng cha của bảng hiện tại dựa vào relation giữa chúng.
Ví dụ sau cho thấy GroupName của user có UserID là “8”:
DataRow[] childRows = userTable.Select("UserID='8'");
DataRow parentRow =
childRows[0].GetParentRow("Group_User");
Console.WriteLine(parentRow["GroupName"])
Data Constraint trong DataTable

Constraint là các “ràng buộc” mà bạn có thể đặt cho DataColumn nhằm hạn chế và
đảm bảo một vài quy tắc nào đó. Có hai loại constraint mà bạn có thể sử dụng:


UniqueConstraint: Các giá trị của cột phải là unique (duy nhất).



ForeignKeyConstraint: Duy trì liên kết giữa các DataTable trong DataSet.


Hai lớp này đều thừa kế từ lớp abstract Constraint:
DataTable userTable = dataSet.Tables["User"];
Constraint constraint=new
UniqueConstraint(userTable.Columns["UserID"],true);
userTable.Constraints.Add(constraint);

Ví dụ trên sẽ tạo constraint cho cột UserID của table User. Tham số thứ hai của
constructor UniqueConstraint chỉ ra cột được sử dụng có phải là primary key khơng. Vì
tơi đặt là true, cột UserID này sẽ trở thành primary key của table này. Bạn có thể đặt thêm
UniqueConstraint này cho bất kì cột nào muốn bảo đảm giữ liệu không trùng nhau. Việc
đặt constraint như trên tương đương với việc bạn gán property DataColumn.Unique =
true. Và với tham số true để xác định primary key thì tương đương với việc bạn đặt
DataTable.PrimaryKey như trong phần trên. .

22

Tieu luan


III.

Kết nối ADO.NET với các cơ sở dữ liệu:

1. ADO.NET kết nối với SQL Server Database
Trong phần này mình có một đoạn code mẫu để kết nối với cơ sở dữ liệu SQL Server và
truy xuất dữ liệu như sau:
SqlConnection connection = new SqlConnection("data
source=.; database=TestDB; integrated security=true");
SqlCommand command = new SqlCommand("Select * from

Customers", Connection);
connection.Open();
SqlDataReader myReader = command.ExecuteReader();
while(myReader.Read())
{
Console.WriteLine("\t{0}/t{1}", myReader.GetInt32(0),
myReader.GetString(1));
}
connection.Close();

*Lưu ý: Để sử dụng được các lớp này các bạn cần khai báo thư viện
System.Data.SqlClient. Đây là một thư viện được sử dụng cho cơ sở dữ liệu SQL
Server.
2. ADO.NET kết nối với Oracle Database
Tương tự như phần trên, ở đây mình có một đoạn code được sử dụng để kết nối với cơ sở
dữ liệu Oracle:
OracleConnection connection = new OracleConnection("data
source=.;database=TestDB; integrated security=true");
OracleCommand command = new OracleCommand("Select * from
Customers", connection);
connection.Open();
OracleDataReader myReader = command.ExecuteReader();

23

Tieu luan


while (myReader.Read())
{

Console.WriteLine("\t{0}\t{1}", myReader.GetInt32(0),
myReader.GetString(1));
}
connection.Close();

*Ngoài ra:
Nếu các bạn muốn giao tiếp với các nguồn dữ liệu OLEDB như Excel, Access, ... thì
bạn cần sử dụng các lớp OleDbConnection, OleDbCommand và OleDbDataReader. Vì
vậy bạn cần khai báo thư viện System.Data.OleDb để có thể sử dụng các lớp của nó.
IV.

Thao tác SQL Server với C# [ADO.NET]

1. Truy xuất dữ liệu từ SQL Server bằng ADO.NET:
Dưới đây là đoạn code mình đã viết dùng để truy xuất dữ liệu từ SQL Server bằng
ADO.NET
static void Main(string[] args)
{
new Program().Retrieve();
Console.ReadKey();
}
public void Retrieve()
{
SqlConnection con = new SqlConnection();
con.ConnectionString =
ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
try
{
SqlCommand cm = new SqlCommand("Select * from student",
con);

con.Open();
24

Tieu luan


SqlDataReader sdr = cm.ExecuteReader();
while (sdr.Read())
{
Console.WriteLine(sdr["id"] + " " + sdr["name"] + " " +
sdr["email"]);
}
}
catch (Exception e)
{
Console.WriteLine("Co loi xay ra !!!" + e);
}
finally
{
con.Close();
}
2. Thêm dữ liệu vào SQL Server bằng ADO.NET
static void Main(string[] args)
{
new Program().Insert();
Console.ReadKey();
}
public void Insert()
{
SqlConnection con = new SqlConnection();

con.ConnectionString =
ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
try
{
SqlCommand cm = new SqlCommand("insert into student (id,
name, email, join_date) values ('101', 'Freetuts.net',
'', '7/27/2021')", con);
25

Tieu luan


×