1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Hướng dẫn sử dụng DataSet để xử lý kết quả kết hợp với Data Adapter docx

20 791 7
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tài liệu hướng dẫn sử dụng DataSet để xử lý kết quả kết hợp với Data Adapter docx
Tác giả Xcross87
Thể loại Tài liệu hướng dẫn
Năm xuất bản 2007
Định dạng
Số trang 20
Dung lượng 96,69 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Không giống với DataReader, tạo ra các đối tượng dùng interface System.DataIDataReader, thì DataSet là một thành phần đặc trưng của ADO.NET được sử dụng bởi tất cả các nhà cung cấp dữ li

Trang 1

Ở bài trước bạn đã biết cách xử lý và hiện kết quả ra màn hình dùng Data Reader Chú ý rằng : nếu chỉ muốn xem thông tin thì dùng Data Reader

Bài này hướng dẫn sử dụng DataSet để xử lý kết quả kết hợp với DataAdapter Không giống với

DataReader, tạo ra các đối tượng dùng interface System.DataIDataReader, thì DataSet là một thành phần đặc trưng của ADO.NET được sử dụng bởi tất cả các nhà cung cấp dữ liệu (data provider) Dataset có thể hoàn toàn độc lập và sử dụng khi kết nối hoặc ngắt kết nối khỏi nguồn Mục đích cơ bản của DataSet là cung cấp xử lý xem xét dữ liệu lưu trữ trong một ‘memory cache’ Nếu như một DataSet không kết nối tới cơ sở dữ liệu thì làm sao mà xử lý dữ liệu và save lại vào database ? Đây là lí do mà DataAdapter ra đời Hãy nghĩ DataAdapter chính là một chiếc cầu nối giữa DataSet và Data Source Nếu không có một DataAdapter nào thì DataSet không thể truy cập bất cứ DataSource nào DataAdapter đảm bào việc kết nối và truyền thông tin cho DataSet

Tìm hiểu về ObjectModel

Đầu tiên thì mình đưa ra một số so sánh giữa DataSet và DataReader nhé, để các bạn tránh hay hỏi nhiều

về việc : Lúc nào thì xài DataSet và lúc nào thì xài DataReader, giống và khác nhau như thế nào ?

So sánh DataSet và DataReader

Nếu bạn đơn giản chi muốn lấy dữ liệu và trình bày nó ra thôi thì dùng DataReader Đặc biệt trường hợp

mà bạn đọc với một số lượng lớn dữ liệu, ví như là vòng lặp tới hàng triệu dòng kết quả dữ liệu, bạn muốn tốc độ đọc nhanh và trình bày nhanh thì DataReader được sử dụng cho mục đích này, NHANH và TIỆN LỢI, cho việc ĐỌC dữ liệu

Nếu bạn muốn chỉnh sử dữ liệu rồi update thông tin dữ liệu lại database thì bạn sử dụng DataSet

DataAdapter lấp đầy (fill) dữ liệu vào DataSet bằng cách sử dụng một DataReader, thêm vào đó resource cần được lưu trữ vào để sử dụng khi ngắt kết nối Vì vậy việc sử dụng DataSet tốn nhiều tài nguyên hơn DataReader rất nhiều, bạn cần cân nhắc ở đây lúc nào sử dụng thành phần nào thì tốt, tránh lạm dụng quá Nếu như bạn muốn đọc dữ liệu và viết ra dưới dạng XML, hoặc export database schema, viết lại db dưới dạng XML,… thì nên sử dụng DataReader

Giới thiệu sơ qua về DataSet

DataSet trong ADO.NET là một bước phát triển lớn trong việc phát triển ứng dụng cơ sở dữ liệu đa hệ Khi lấy và chỉnh sửa dữ liệu, duy trì liên tục kết nối tới Data Source trong khi chờ user yêu cầu thì rõ ràng

là tốn tài nguyên máy rất nhiều

DataSet giúp ích ở đây rất lớn Vì DataSet cho phép lưu trữ dữ liệu và chỉnh sửa tại ‘local cache’, hay gọi

là offline mode Có thể xem xét và xử lý thông tin trong khi ngắt kết nối Sau khi chỉnh sửa và xem xong thì tạo một kết nối và update dữ liệu từ local vào Data Source

Dữ liệu trong DataSet được lưu trữ dưới dạng một Collection các Tables và bạn cần phải xử lý thông qua các lớp DataTable -> DataRow và DataColumn

Bảng dưới đây là kiến trúc DataSet

Trang 2

Giới thiệu về DataAdapter

Bạn chỉ cần tưởng tượng rằng : bạn có một cái bể nước (DataSource) , một cái máy bơm (DataAdapter)

và một cái thùng đựng nước (DataSet) Thì khi lấy nước dùng cái bơm lấy nước từ bể, kiểm tra và lọc nước sau đó lại dùng cái bơm hút lại về cái bể nước Đó chính là vai trò của cái bơm và DataAdapter tương tự như vậy ^_^! Giải thích hơi chuối :D

Tương quan 3 lớp như thế này :

Trang 3

Có 4 cách tạo DataAdapter :

[code]

// Cách 1 : Đơn giản chỉ khai báo tạo đối tượng Adapter

SqlDataAdapter da = new SqlDataAdapter();

// Cách 2 : Thiết lập đối tượng SqlCommand

SqlDataAdapter da = new SqlDataAdapter(cmd);

// Cách 3 : Thiết lập query và đối tượng SqlConnection

SqlDataAdapter da = new SqlDataAdaoter(sql, conn);

// Cách 4 : Thiết lập query và mệnh lệnh thực thi

SqlDataAdapter da = new SqlDataAdapter(sql, connString);

Giới thiệu về DataTable và thành phần kèm

Nằm trong lớp : System.Data.DataTable Có cấu trúc theo cấu trúc của bảng trong cơ sở dữ liệu gồm các hàng và cột nên có 2 thành phần kèm theo là : DataRow và DataColumn

DataRow sẽ là tập hợp các cột (record-set)

Trang 4

DataColumn là tập hợp các hàng cùng một đặc tính (Field)

Ví dụ :

[code]

DataTable dt = new DataTable();

DataColumn col = dt.Columns[“Contact”]; // Cột Contact

DataColumn col = dt.Columns[2];

DataRow row = dt.Rows[2];

[/code]

Vậy là đủ giới thiệu qua Bây giờ vào vấn đề chính nào

Làm việc với DataSet và DataAdapter

Tạo một dataset :

[code]

DataSet ds = new DataSet();

DataSet ds = new DataSet(“DataSet Name”);

[/code]

Nếu bạn dùng cách 1 thì theo mặc định DataSet sẽ có tên là “NewDataSet”, cách thứ 2 là bạn đặt tên luôn cho DataSet bên trong constructor Hoặc bạn có thẻ thay đổi tên của DataSet bằng thuộc tính

‘DataSetName’

Có nhiều cách xử lý với DataSet như

 Sử dụng thông qua Adapter

 Đọc từ một tài liệu XML

Cách thứ 2 đễ lúc khác nhé Làm cơ bản trước đã

Thử xử lý dữ liệu bằng một ví dụ :

[code]

using System;

using System.Data;

using System.Data.SqlClient;

Trang 5

namespace MSSQL_Server

{

class Database

{

static void Main(string[] args)

{

// Tạo connection strin

string connString = @"Server = \SQLEXPRESS;

Integrated Security = True;

Database = Northwind";

// Tạo SQL query

string sql = @"SELECT productname, unitprice FROM products WHERE unitprice < 20";

// Tạo connection

SqlConnection conn = new SqlConnection(connString);

try

{

// Mỏ kết nối

conn.Open();

// Tạo Adapter

SqlDataAdapter da = new SqlDataAdapter(sql, conn);

// Tạo DataSet

DataSet ds = new DataSet();

// Lấp đầy kết quả vào DataSet

da.Fill(ds, "products");

// Tạo DataTable thu kết quả từ bảng

DataTable dt = ds.Tables["products"];

// In kết quả ra Console

foreach (DataRow row in dt.Rows)

{

foreach (DataColumn col in dt.Columns)

Console.WriteLine(row[col]);

Console.WriteLine("".PadLeft(20, '='));

}

}

catch (Exception e)

{

// Bắt lỗi

Console.WriteLine(e.Message);

}

finally

{

// Đóng kết nối

conn.Close();

}

}

}

}

[/code]

Phân tích bài đơn giản ở trên nha

Sau khi đã mở kết nối thì ta tạo một Adapter Adapter này chứa thông tin về SQL query cần thực thi và một đối tượng kết nối conn, sau đó tạo một DataSet Lúc này thì DataSet chưa có gì Sau đó lấp đầy kết quả vào DataSet bằng method ‘Fill’ của Adapter Từ đó hiểu thêm rằng : Adapter tự động thực thi câu

Trang 6

lệnh SQL , thu lấy kết quả và gán hết vào DataSet Khác với DataReader cần có một đối tượng

SqlComnmand đễ xử lý Nếu khi lấp đầy kết quả vào DataSet mà không gán tên bảng nào thì tự động trong DataSet tên lần lượt từng bảng là ‘TableN’ với bảng đầu tiên là Table, Table1,Table2…TableN Nếu một query được thực thi lại nhiều lần thì DataSet sẽ cập nhật thông tin từng đó bảng vào trong Chú ý trong Adapter ở trên nếu thay bằng cách tạo Adapter dưới đây :

[code]

// Tạo Adapter

SqlDataAdapter da = new SqlDataAdapter();

da.SelectCommand = new SqlCommand(sql, conn);

[/code]

Thì kết quả thu được giống hệt nhau, không có gì thay đổi

DataSet có thể chứa nhiều table vì thế khi xử lý Table nào cần phải gán vào DataTable một tên table cụ thể Và cuối cùng dùng DataColumn và DataRow để xử lý DataTable đó Đó là cách extract dữ liệu từ DataSet

Phân loại và Sắp xếp trong DataSet

Thử ví dụ dưới đây :

[code]

using System;

using System.Data;

using System.Data.SqlClient;

namespace MSSQL_Server

{

class Database

{

static void Main(string[] args)

{

// Tạo connection strin

string connString = @"Server = \SQLEXPRESS;

Integrated Security = True;

Database = Northwind";

// Tạo SQL query

string sql1 = @"SELECT * FROM customers ";

string sql2 = @"SELECT * FROM products WHERE unitprice < 10 "; // Trộn 2 query vào làm 1

string sql = sql1 + sql2;

// Tạo connection

SqlConnection conn = new SqlConnection(connString);

try

{

// Tạo Adapter

SqlDataAdapter da = new SqlDataAdapter();

Trang 7

da.SelectCommand = new SqlCommand(sql, conn);

// Tạo và lấp đầy DataSet

DataSet ds = new DataSet();

da.Fill(ds, "customers");

// Lấy Data Table Collection

DataTableCollection dtc = ds.Tables;

// Xử lý Table thứ nhất

Console.WriteLine("Result from Customers table : ");

Console.WriteLine("Company Name".PadRight(20) + "Contact Name".PadLeft(23) + "\n");

// Thiệt lập Filter

string filter = "country = 'Germany'";

// Thiết lập Sort

string sort = "companyname ASC";

// Hiển thị thông tin đã sort và filter

foreach (DataRow row in dtc["customers"].Select(filter, sort)) {

Console.WriteLine("{0}\t{1}",

row["companyname"].ToString().PadRight(20),

row["contactname"]);

}

// Xử lý table thứ hai

Console.WriteLine("\n -");

Console.WriteLine("Result from Products table");

Console.WriteLine("ProductName".PadRight(20) +

"UnitPrice".PadLeft(21) + "\n");

// Hiển thị thông tin

foreach (DataRow row in dtc[1].Rows)

{

Console.WriteLine("{0}\t{1}",

row["productname"].ToString().PadRight(25),

row["unitprice"]);

}

}

catch (Exception e)

{

// Bắt lỗi

Console.WriteLine(e.Message);

}

finally

{

// Đóng kết nối

conn.Close();

}

}

}

}

Trang 8

Hay à nha…:D

Code này ở đây nhiều chỗ hơi bị phong độ đây Chú ý và cẩn thận nhé Cố gắng nhớ những gì tớ trình bày

ở đây nè, hơi rắc rối một chút đây ^_^!

Ở đây xử lý 2 query sql1 và sql2 và chúng được combine vào thành 1 chuỗi query sql

Adapter tạo ra thực thi 2 query này Vậy thì xử lý dữ liệu thế nào ? Từ từ để sau

Sau đó lấp đầy DataSet Chú ý cài này :

[code]

da.Fill(ds, “customers”);

[/code]

Nhắc lại nào, 2 query ở trên là gọi dữ liệu từ 2 bảng : ‘customers’ và ‘products’ Ở đây là lấp đầy

‘customers’ Sau đó bạn xem đến hết code, không hề thấy lấp đầy thằng ‘products’ mà vẫn in ra kết quả của bảng đó Vậy là sao ? Cái đó thì phải hỏi xem thằng Fill làm việc thế nào

Bây giờ bạn thử chèn thêm xuống dưới cùng trong khối ‘try’ đoạn code sau để phân tích thằng Fill [code]

Console.WriteLine(ds.Tables[0]);

Console.WriteLine(ds.Tables[1]);

[/code]

Nghĩa là in ra tên 2 bảng trong DataSet Bạn sẽ thấy bảng đầu tiên là ‘customers’ còn bảng tiếp theo là

‘customer1’

Sau đó bạn thử ‘foreach’ lấy hết kết quả của customers1 ra check thì nó chính là kết quả thu được từ query vào bảng ‘products’

Từ đó có thể suy luận ra cách làm việc của Fill, đầu tiên ta nhớ lại là DataSet là lưu trữ một loạt các Tables, khi Fill thì Adapter sẽ lấp đầy tất cả các kết quả từ các Table vào DataSet Vậy thì ở đây sau khi

đã query 2 tables thì fill lần lượt từ ‘customer’ đến ‘products’ với các Table sau customer bị đổi tên thành

‘customerN’ hết

Để muốn lấy lại tên ban đầu cho ‘products’ thì bạn chỉ cần thay đổi tên đi là được :

[code]

ds.Tables[1].TableName = “products”;

[/code]

Trang 9

Chú ý vì query sẽ được thực hiện lần lượt theo thứ tự nên các bảng cũng theo thứ tự đó.

Bây giờ nghĩ ra một cái hay nha

[code]

da.Fill(ds, “products”);

[/code]

Thay vào trên thì sao nhỉ ?

Bị lỗi : Object Reference is not an instance of an object

Là sao ? Tức là con trỏ vào đối tượng bị NULL Tại sao bị NULL ?

Thế này, theo thứ tự query thì ‘customers’ ở trước ‘products’ Cho nên khi Fill cũng theo thứ tự đó Nghĩa

là phải fill bắt đầu từ Customers thì con trỏ bắt đầu đi từ Tables[0] Ở đây ta bỏ qua ‘customers’ mà vào luôn ‘products’ tức là Table[1], vậy là không có con trỏ tới Tables[0] Đây bị coi là một Exception trong NET Vì thế nếu muốn xử lý products trước thì phải thay đổi thứ tự query tức là :

Sql = sql2 + sql1;

Lúc đó nếu Fill như trên thì tên của bảng ‘customers’ sẽ bị đổi thành ‘products1’

Ok Tiếp !

Lúc này DataSet chứa nhiệu Table và ta muốn lấy tất cả thì dùng DataTableCollection để thu lượm tât cả các table trong DataSet Hoặc nếu trình cao thì cứ lấy lần lượt theo index ds.Tables[int index]

Bạn để ý tiếp có 2 string mới tạo là ‘filter’ và ‘sort’

Đây là dùng để lọc và sắp xếp dữ liệu Vậy thì nguyên tắc làm thế nào ?

Đơn giản là bạn dùng bộ lọc của SQL, tức là tạo chuỗi ‘filter’ và ‘sort’ theo syntax viết một câu SQL ấy

Có gì xem bài viết đầu tiên về SQL của tớ nha

Trong các table đều có Method Select(string filter, string sort) đễ lọc dữ liệu và sắp xếp Ví dụ như code trên tớ dùng Select trong DataTableCollection Nếu trong DataSet thì nó là :

ds.Tables[int index].Select(string filter, string sort);

Nào, chưa hết cái hay nha, tiếp

Hôm nọ tienlbhoc có hỏi tớ thế này :

“ Tớ có đọc sách thấy sách nó dùng ví dụ, có Adapter và Connection mà chẳng bao giờ mở (open) connection mà chương trình chạy vẫn tốt, thế là thế nào nhỉ? “

Trang 10

Hì hì, vấn đề ở chỗ tớ viết trên cùng về cái máy bơm Cái máy bơm thông với cái bể, bây giờ truyền nước

và không truyền nước là do cái máy bơm quyết định Cũng vậy ở đây bạn so sánh 2 cái ví dụ ở trên, một cái mở kết nối conn.Open() còn cái ví dụ dưới thì không cần mở Nhắc lại method Fill(), method này là một đặc trưng của ADO.NET được cung cấp để truyền dữ liệu các DataSet và nó TỰ ĐỘNG mở kết nối khi gọi nó nếu như kết nối không được mở Và sau khi fill vào DataSet thì lại tự động đóng kết nối Mọi việc ở đây nằm trong quyền kiểm soát của cái Adapter hết Bạn có thể tự kiểm tra tình trạng kết nối State

để xác minh

Sử dụng DataView

DataView được dùng để xem thông tin dữ liệu của một bảng, giống như SQL view, thêm nữa nó không giữ một tí dữ liệu nào

Vi dụ : Sử dụng DataView

[code]

using System;

using System.Data;

using System.Data.SqlClient;

namespace MSSQL_Server

{

class Database

{

static void Main(string[] args)

{

// Tạo connection strin

string connString = @"Server = \SQLEXPRESS;

Integrated Security = True;

Database = Northwind";

// Tạo SQL query

string sql = @"SELECT contactname, country FROM customers ";

// Tạo connection

SqlConnection conn = new SqlConnection(connString);

try

{

// Tạo Adapter

SqlDataAdapter da = new SqlDataAdapter();

da.SelectCommand = new SqlCommand(sql, conn);

// Tạo và lấp đầy DataSet

DataSet ds = new DataSet();

da.Fill(ds, "customers");

// Lấy thông tin Table vào DataTable

DataTable dt = ds.Tables["customers"];

// Tạo DataView

DataView dv = new DataView(dt, "country = 'Germany'",

"country", DataViewRowState.CurrentRows);

// Hiển thị thông tin trong DataView

foreach (DataRowView drv in dv)

{

for (int i = 0; i < dv.Table.Columns.Count; i++)

Trang 11

{

Console.Write(drv[i] + "\t"); }

Console.WriteLine("");

}

}

catch (Exception e)

{

// Bắt lỗi

Console.WriteLine(e.Message);

}

finally

{

// Đóng kết nối

conn.Close();

}

}

}

}

[/code]

Có thể thấy cách tạo một DataView rất đơn giản

Với 4 đối số : a tên Table b.filter c sort d.DataViewRowState enum

Giải thích một chút về DataViewRowState

 Added : dòng mới

 CurrentRows : các dòng hiện tại, chưa bị thay đổi, mới và đã bị sửa đổi

 Deleted : dòng đã xóa

 ModifiedCurrent : giá trị đã sửa của dòng đã sửa

 ModifiedOriginal : giá trị trước khi sửa của dòng đã sửa

 None : Không lấy dòng nào

 OriginalRows : tất cả dòng ban đầu

 Unchanged : một dòng chưa bị sửa đổi

Mỗi thao tác của bạn sẽ có thể làm thay đổi RowState, vì vậy nên chú ý và sử dụng cho hợp lý

Sửa dữ liệu trong DataSet

Dưới đây là minh họa sửa đổi dữ liệu trong DataSet Nên nhớ là thay đổi trong dataset không hề ảnh hưởng gì đến Data Source Muốn thay đổi trong Data Source thì phải tạo một kết nối tới database và update dữ liệu thay đổi lên thông qua DataSet và DataAdapter

[code]

using System;

using System.Data;

using System.Data.SqlClient;

Ngày đăng: 22/01/2014, 12:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w