SlideShare una empresa de Scribd logo
1 de 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


Ở 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
                                    Page 1 of 25
Sử dụng DataAdapter và DataSet                             Author : Xcross87   2007


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.




                                      Page 2 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007




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 :

                                    Page 3 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007




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



                                     Page 4 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


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)

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ư

                                    Page 5 of 25
Sử dụng DataAdapter và DataSet                      Author : Xcross87   2007


         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;

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]);

                                     Page 6 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


                             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 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.

                                     Page 7 of 25
Sử dụng DataAdapter và DataSet                        Author : Xcross87   2007


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();
                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

                                     Page 8 of 25
Sử dụng DataAdapter và DataSet                       Author : Xcross87   2007


                       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();
                 }

           }
      }

                                   Page 9 of 25
Sử dụng DataAdapter và DataSet                             Author : Xcross87   2007


}
[/code]

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‟.


                                     Page 10 of 25
Sử dụng DataAdapter và DataSet                               Author : Xcross87   2007


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]

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 !

                                     Page 11 of 25
Sử dụng DataAdapter và DataSet                              Author : Xcross87   2007


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ỉ? “

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
                                       Page 12 of 25
Sử dụng DataAdapter và DataSet                   Author : Xcross87   2007


[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++)
                    {
                        Console.Write(drv[i] + "t");
                    }
                    Console.WriteLine("");
                }
            }
            catch (Exception e)

                                 Page 13 of 25
Sử dụng DataAdapter và DataSet                              Author : Xcross87   2007


                 {
                       // 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]

                                      Page 14 of 25
Sử dụng DataAdapter và DataSet                      Author : Xcross87   2007


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 * FROM employees WHERE country
= 'UK' ";
            // 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, "employees");
                       // Lấy thông tin Table vào DataTable
                       DataTable dt = ds.Tables["employees"];

                       // Cột FirstName có thể Null
                       dt.Columns["FirstName"].AllowDBNull = true;
                       // Thay đổi City của Row đầu tiên
                       dt.Rows[0]["City"] = "Seoul";
                       // Thêm một dòng mới nha
                       DataRow newRow = dt.NewRow();
                       newRow["FirstName"] = "Pete";
                       newRow["LastName"] = "Houston";
                       newRow["TitleOfCourtesy"] = "Sir";
                       newRow["City"] = "Seoul";
                       newRow["Country"] = "South Korea";
                       dt.Rows.Add(newRow);

                       // Add xong hiển thị thông tin từ DataSet ra màn
hình xem
                       // đã update chưa

                                   Page 15 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007



                       foreach (DataRow row in dt.Rows)
                       {
                           Console.WriteLine("{0} {1} {2}",

row["FirstName"].ToString().PadRight(10),

row["LastName"].ToString().PadLeft(10),
                            row["City"]);
                }
            }
            catch (Exception e)
            {
                // Bắt lỗi
                Console.WriteLine(e.Message);
            }
            finally
            {
                // Đóng kết nối
                conn.Close();
            }

           }
     }
}
[/code]

Run code trên xong, bạn thấy kết quả dòng trên cùng City là „Seoul‟ và dưới cùng
là một dòng mới, đó chính là thông tin của newRow đã thêm.

Ở đây có thay đổi settings của Table, mặc định thì cột FirstName không được Null,
mình ở đây sửa lại phát cho phép null luôn, và thay đổi dòng đầu tiên ở cột City.
Sau đó thêm dòng mới vào DataSet. Chắc không có gì nói nhiều về cái này nhỉ.

Thay đổi dữ liệu trong Data Source

Quay về Adapter, để update thông tin thì ta dùng các thuộc tính : UpdateCommand,
InsertCommand, DeleteCommand, còn SelectCommand thì không phải vì nó cung
cấp SqlCommand để thực thi và chẳng ảnh hưởng gì đến xã hội cơ sở dữ liệu :D.

Thuộc tính UpdateCommand

Như tên gọi đã nói lên đây là thực hiện Statement thay đổi dữ liệu trong database
hay là câu lệnh UPDATE….SET

                                    Page 16 of 25
Sử dụng DataAdapter và DataSet                           Author : Xcross87   2007


Ví dụ thưc hiện Update :

[code]

da.UpdateCommand = new SqlCommand(“UPDATE employees

                                  SET city = „” + dt.Rows[0][“city”] + “‟

                                  WHERE employeeid = „” +
dt.Rows[0][“employeeid”] + “‟ “

                                     , conn);

// Thay đổi dữ liệu của bảng employee lên database source

da.Update(ds, “employees”);

[/code]

Dưới đây tớ làm ví dụ minh họa sử dụng luôn, tớ sẽ xài tham số trong lệnh truyền
vào SQL cho thực dụng …hehe

[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 qry = @"SELECT * FROM employees WHERE country
= 'UK' ";
            string upd = @"UPDATE employees SET city = @city
WHERE employeeid = @employeeid ";

                 // Tạo connection

                                   Page 17 of 25
Sử dụng DataAdapter và DataSet                       Author : Xcross87   2007


                 SqlConnection conn = new SqlConnection(connString);
                 try
                 {
                     // Tạo Adapter
                     SqlDataAdapter da = new SqlDataAdapter();
                     da.SelectCommand = new SqlCommand(qry, conn);

                       // Tạo và lấp đầy DataSet
                       DataSet ds = new DataSet();
                       da.Fill(ds, "employees");
                       // Lấy thông tin Table vào DataTable
                       DataTable dt = ds.Tables["employees"];

                       // Sửa dòng đàu tiên
                       dt.Rows[0]["city"] = "Seoul";
                       // In ra màn hình xem sự thay đổi trong DataSet
                       foreach (DataRow row in dt.Rows)
                       {
                           Console.WriteLine("{0} {1} {2}",
                               row["firstname"].ToString().PadLeft(14),
                               row["lastname"].ToString().PadRight(15),
                               row["city"]);
                       }

                       // Tiến hành update vào database Source
                       // tạo command trước
                       SqlCommand cmd = new SqlCommand(upd, conn);
                       // Xử lý các Parameter trong command
                       cmd.Parameters.Add("@city", SqlDbType.NVarChar,
15, "city");
                SqlParameter param =
cmd.Parameters.Add("@employeeid", SqlDbType.Int, 4,
"employeeid");
                param.SourceVersion = DataRowVersion.Original;

                       // UPDATE
                       da.UpdateCommand = cmd;
                       da.Update(ds, "employees");
                 }
                 catch (Exception e)
                 {
                     // Bắt lỗi
                     Console.WriteLine(e.Message);
                 }
                 finally
                 {
                     // Đóng kết nối

                                   Page 18 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


                       conn.Close();
                 }

           }
     }
}
[/code]

Để biết code trên ra kết quả thế nào thì, mở SQL Server Management Studio 2005
Express ra rồi run query sau :

[code]
use Northwind
SELECT firstname,lastname,city
FROM employees
WHERE country = 'UK'

[/code]

Bạn sẽ thu được các value cần thiết. Sau đó run code ở trên, rồi run lại query SQL
trên, sẽ thấy dòng trên cùng city sẽ bị thay đổi thành Seoul.

Thuộc tính InsertCommand

Ví dụ thử Insert thêm một dòng heng

[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 qry = @"SELECT * FROM employees WHERE country
= 'UK' ";

                                    Page 19 of 25
Sử dụng DataAdapter và DataSet                      Author : Xcross87   2007


            string ins = @"INSERT INTO employees (firstname,
lastname, titleofcourtesy, city, country) VALUES
                           (@firstname, @lastname,
@titleofcourtesy, @city, @country) ";


                 // Tạo connection
                 SqlConnection conn = new SqlConnection(connString);
                 try
                 {
                     // Tạo Adapter
                     SqlDataAdapter da = new SqlDataAdapter();
                     da.SelectCommand = new SqlCommand(qry, conn);

                       // Tạo và lấp đầy DataSet
                       DataSet ds = new DataSet();
                       da.Fill(ds, "employees");
                       // Lấy thông tin Table vào DataTable
                       DataTable dt = ds.Tables["employees"];

                       // Tạo thêm row mới
                       DataRow newRow = dt.NewRow();
                       newRow["firstname"] = "Pete";
                       newRow["lastname"] = "Houston";
                       newRow["titleofcourtesy"] = "Sir";
                       newRow["city"] = "Seoul";
                       newRow["country"] = "South Korea";
                       dt.Rows.Add(newRow);
                       // Hiển thị thông tin các rows trong DataSet
                       foreach (DataRow row in dt.Rows)
                       {
                           Console.WriteLine("{0} {1} {2}",

row["firstname"].ToString().PadRight(15),

row["lastname"].ToString().PadLeft(15),
                            row["city"]);
                }

                // Làm việc với Insert
                SqlCommand cmd = new SqlCommand(ins, conn);
                cmd.Parameters.Add("@firstname",
SqlDbType.NVarChar, 10, "firstname");
                cmd.Parameters.Add("@lastname",
SqlDbType.NVarChar, 20, "lastname");
                cmd.Parameters.Add("@titleofcourtesy",
SqlDbType.NVarChar, 25, "titleofcourtesy");

                                   Page 20 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


                       cmd.Parameters.Add("@city", SqlDbType.NVarChar,
15, "city");
                cmd.Parameters.Add("@country",
SqlDbType.NVarChar, 15, "country");
                // Tiến hành insert vào database Source
                da.InsertCommand = cmd;
                da.Update(ds, "employees");


                 }
                 catch (Exception e)
                 {
                     // Bắt lỗi
                     Console.WriteLine(e.Message);
                 }
                 finally
                 {
                     // Đóng kết nối
                     conn.Close();
                 }

           }
     }
}
[/code]



Rất đơn giản nên mình không giải thích gì ở đây

Thuộc tình DeleteCommand

Cái này các bạn thử nghiệm tự viết code thực hành nhé.

Giới thiệu về SqlCommandBuilder

Nhìn lại các code ở trên để update dữ liệu lên DataSource công nhận quá dài và
„hơi bị NẢN‟ khi viết code. Mệt nhất là khoản debug, quá rắc rồi và phức tạp. Vì
vậy mà thằng cu SqlCommandBuilder trong họ đã ra đời để phục vụ việc tạo các
statement „INSERT, UPDATE, DELETE‟ một cách tự động.

Thêm chú ý là sau khi thay đổi thông tin trên data source thì bạn phải gọi method
„RefreshSchema‟ của commandbuilder để cập nhật thông tin của metadata tương
ứng.

                                    Page 21 of 25
Sử dụng DataAdapter và DataSet                      Author : Xcross87   2007


Làm ví dụ thêm một dòng vào database dùng SqlCommandBuilder nha

[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 qry = @"SELECT * FROM employees WHERE country
= 'UK' ";

                 // Tạo connection
                 SqlConnection conn = new SqlConnection(connString);
                 try
                 {
                     // Tạo Adapter
                     SqlDataAdapter da = new SqlDataAdapter();
                     da.SelectCommand = new SqlCommand(qry, conn);

                       // Tạo commandbuider
                       SqlCommandBuilder cb = new SqlCommandBuilder(da);

                       // Tạo và lấp đầy DataSet
                       DataSet ds = new DataSet();
                       da.Fill(ds, "employees");
                       // Lấy thông tin Table vào DataTable
                       DataTable dt = ds.Tables["employees"];

                       // Tạo thêm row mới
                       DataRow newRow = dt.NewRow();
                       newRow["firstname"] = "Pete";
                       newRow["lastname"] = "Houston";
                       newRow["titleofcourtesy"] = "Sir";
                       newRow["city"] = "Seoul";
                       newRow["country"] = "South Korea";
                       dt.Rows.Add(newRow);

                                   Page 22 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


                       // Hiển thị thông tin các rows trong DataSet
                       foreach (DataRow row in dt.Rows)
                       {
                           Console.WriteLine("{0} {1} {2}",

row["firstname"].ToString().PadRight(15),

row["lastname"].ToString().PadLeft(15),
                            row["city"]);
                }
                da.Update(ds, "employees");
            }
            catch (Exception e)
            {
                // Bắt lỗi
                Console.WriteLine(e.Message);
            }
            finally
            {
                // Đóng kết nối
                conn.Close();
            }

           }
     }
}
[/code]

Thấy hay không? Dùng SqlCommandBuilder thì bỏ đi được bao nhiêu đoạn cần
thiết. So sánh với bài InsertCommand ở trên chắc là ngắn hơn được ¼ mà đọc code
dễ hiểu hơn.



DataSet và XML
Bạn muốn extract dữ liệu trong DataSet ra một file định dạng XML ?

Liệu có cần đòi hỏi kiến thức XML để làm việc ?...heheh . Không cần biết về XML
vẫn extract được

Một ví dụ viết lưu dữ liệu trong DataSet dưới dạng XML.

[code]


                                   Page 23 of 25
Sử dụng DataAdapter và DataSet                       Author : Xcross87   2007


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 qry = @"SELECT firstname,lastname, city FROM
employees WHERE country = 'UK' ";

                 // Tạo connection
                 SqlConnection conn = new SqlConnection(connString);
                 try
                 {
                     // Tạo Adapter
                     SqlDataAdapter da = new SqlDataAdapter();
                     da.SelectCommand = new SqlCommand(qry, conn);

                       // Tạo commandbuider
                       SqlCommandBuilder cb = new SqlCommandBuilder(da);

                       // Tạo và lấp đầy DataSet
                       DataSet ds = new DataSet();
                       da.Fill(ds, "employees");
                       // Extract ra file dưới dạng XML
                       ds.WriteXml(@"P:database.xml");

                 }
                 catch (Exception e)
                 {
                     // Bắt lỗi
                     Console.WriteLine(e.Message);
                 }
                 finally
                 {
                     // Đóng kết nối
                     conn.Close();
                 }


                                   Page 24 of 25
Sử dụng DataAdapter và DataSet                            Author : Xcross87   2007


           }
     }
}
[/code]

Sau đó check file „database.xml‟ như đặt trên trong code kiểm tra ^_^.

Bạn sẽ thấy thẻ <NewDataSet> chính là name của DataSet. Bạn có thể tùy ý thay
đổi DataSetName

Thêm một chú ý nữa : bạn có thể dùng DataTable để lấy thông tin trong bảng từ
DataAdapter thông qua method Fill

da.Fill(dt);

Trong ADO.NET có một thành phần rất đặc biệt có tên là Typed DataSet. Mình sẽ
nói về cái này sau.

Bài viết có lẽ quá dài nên kết thúc ở đây.




                                     Page 25 of 25

Más contenido relacionado

La actualidad más candente

Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPTBài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPTMasterCode.vn
 
04 chuong 4 - cap nhat du lieu
04   chuong 4 - cap nhat du lieu04   chuong 4 - cap nhat du lieu
04 chuong 4 - cap nhat du lieutruong le hung
 
01 chuong 1 - gioi thieu ado.net va ket noi den csdl
01   chuong 1 - gioi thieu ado.net va ket noi den csdl01   chuong 1 - gioi thieu ado.net va ket noi den csdl
01 chuong 1 - gioi thieu ado.net va ket noi den csdltruong le hung
 
04 chuong 4 - sap xep, tim kiem, loc du lieu
04   chuong 4 - sap xep, tim kiem, loc du lieu04   chuong 4 - sap xep, tim kiem, loc du lieu
04 chuong 4 - sap xep, tim kiem, loc du lieutruong le hung
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#Dao Uit
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...MasterCode.vn
 
5.cach su dung data reader
5.cach su dung data reader5.cach su dung data reader
5.cach su dung data readerDao Uit
 
Hướng dẫn lập trình quản lý c#
Hướng dẫn lập trình quản lý c#Hướng dẫn lập trình quản lý c#
Hướng dẫn lập trình quản lý c#An Nguyen
 
04 chuong 4 - databinding
04   chuong 4 - databinding04   chuong 4 - databinding
04 chuong 4 - databindingtruong le hung
 
Bài 11 tạo bảng và sử dụng các kiểu dữ liệu
Bài 11 tạo bảng và sử dụng các kiểu dữ liệuBài 11 tạo bảng và sử dụng các kiểu dữ liệu
Bài 11 tạo bảng và sử dụng các kiểu dữ liệuzzsunzz
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data setstruong le hung
 
Trong bài viết hôm nay
Trong bài viết hôm nayTrong bài viết hôm nay
Trong bài viết hôm nayledoanduc
 
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPTBài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPTMasterCode.vn
 
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPTBài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPTMasterCode.vn
 

La actualidad más candente (20)

Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPTBài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
 
Ung dung web chuong 6
Ung dung web  chuong 6Ung dung web  chuong 6
Ung dung web chuong 6
 
04 chuong 4 - cap nhat du lieu
04   chuong 4 - cap nhat du lieu04   chuong 4 - cap nhat du lieu
04 chuong 4 - cap nhat du lieu
 
01 chuong 1 - gioi thieu ado.net va ket noi den csdl
01   chuong 1 - gioi thieu ado.net va ket noi den csdl01   chuong 1 - gioi thieu ado.net va ket noi den csdl
01 chuong 1 - gioi thieu ado.net va ket noi den csdl
 
04 chuong 4 - sap xep, tim kiem, loc du lieu
04   chuong 4 - sap xep, tim kiem, loc du lieu04   chuong 4 - sap xep, tim kiem, loc du lieu
04 chuong 4 - sap xep, tim kiem, loc du lieu
 
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#2.gioi thieu co ban ado.net cho nguoi lap trinh c#
2.gioi thieu co ban ado.net cho nguoi lap trinh c#
 
Cach su dung data reader
Cach su dung data readerCach su dung data reader
Cach su dung data reader
 
04 ado
04 ado04 ado
04 ado
 
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
Bài 4: Lập trình với CSDL ADO.NET & Kiến trúc không kết nối & Lập trình giao ...
 
5.cach su dung data reader
5.cach su dung data reader5.cach su dung data reader
5.cach su dung data reader
 
ôn tập dbms
ôn tập dbmsôn tập dbms
ôn tập dbms
 
Hướng dẫn lập trình quản lý c#
Hướng dẫn lập trình quản lý c#Hướng dẫn lập trình quản lý c#
Hướng dẫn lập trình quản lý c#
 
04 chuong 4 - databinding
04   chuong 4 - databinding04   chuong 4 - databinding
04 chuong 4 - databinding
 
Bài 11 tạo bảng và sử dụng các kiểu dữ liệu
Bài 11 tạo bảng và sử dụng các kiểu dữ liệuBài 11 tạo bảng và sử dụng các kiểu dữ liệu
Bài 11 tạo bảng và sử dụng các kiểu dữ liệu
 
03 chuong 3 - data sets
03   chuong 3 - data sets03   chuong 3 - data sets
03 chuong 3 - data sets
 
Trong bài viết hôm nay
Trong bài viết hôm nayTrong bài viết hôm nay
Trong bài viết hôm nay
 
01 tong-quan-ado
01 tong-quan-ado01 tong-quan-ado
01 tong-quan-ado
 
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPTBài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
Bài 1: Làm quen với SQL Server 2008 - Giáo trình FPT
 
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPTBài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
Bài 3: Làm việc với kiểu dữ liệu và mã kịch bản - Giáo trình FPT
 
Bài 6: Working with DATA
Bài 6: Working with DATABài 6: Working with DATA
Bài 6: Working with DATA
 

Similar a 6.adapterset

Chuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netChuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netThuyNguyenThi25
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#Dao Uit
 
Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Hiển Phùng
 
7.databinding
7.databinding7.databinding
7.databindingDao Uit
 
Cach su dung databinding
Cach su dung databindingCach su dung databinding
Cach su dung databindingtruong le hung
 
Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Hiển Phùng
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieuDao Uit
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaANHMATTROI
 
7 databinding-120306231825-phpapp02(1)
7 databinding-120306231825-phpapp02(1)7 databinding-120306231825-phpapp02(1)
7 databinding-120306231825-phpapp02(1)TI Anh
 
Thuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieuThuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieutruong le hung
 
Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#truong le hung
 
Cai tien trong lenh t sql cua sql server 2008 (2)
Cai tien trong lenh t sql cua sql server 2008 (2)Cai tien trong lenh t sql cua sql server 2008 (2)
Cai tien trong lenh t sql cua sql server 2008 (2)khanhtoankmz
 
Cập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbCập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbANHMATTROI
 
Mo hinh ado.net
Mo hinh ado.netMo hinh ado.net
Mo hinh ado.netXuan Tran
 

Similar a 6.adapterset (20)

Chuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.netChuong 07_ gắng kết dữ liệu asp.net
Chuong 07_ gắng kết dữ liệu asp.net
 
3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#3.tao mot ket noi toi co so du lieu dung c#
3.tao mot ket noi toi co so du lieu dung c#
 
Data provider
Data providerData provider
Data provider
 
Ung dung web chuong 7
Ung dung web  chuong 7Ung dung web  chuong 7
Ung dung web chuong 7
 
Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1Lap trinhcosodulieuvoi c-sharp_phan-1
Lap trinhcosodulieuvoi c-sharp_phan-1
 
7.databinding
7.databinding7.databinding
7.databinding
 
Cach su dung databinding
Cach su dung databindingCach su dung databinding
Cach su dung databinding
 
Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2Lap trinhcosodulieuvoi c-sharp_phan-2
Lap trinhcosodulieuvoi c-sharp_phan-2
 
4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu4.thuc thi menh lenh voi co so du lieu
4.thuc thi menh lenh voi co so du lieu
 
Lớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong javaLớp kết nối csdl dùng jdbc trong java
Lớp kết nối csdl dùng jdbc trong java
 
7 databinding-120306231825-phpapp02(1)
7 databinding-120306231825-phpapp02(1)7 databinding-120306231825-phpapp02(1)
7 databinding-120306231825-phpapp02(1)
 
Thuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieuThuc thi menh lenh voi co so du lieu
Thuc thi menh lenh voi co so du lieu
 
Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#Tao mot ket noi toi co so du lieu dung c#
Tao mot ket noi toi co so du lieu dung c#
 
Asp.net 3.5 _8
Asp.net 3.5 _8Asp.net 3.5 _8
Asp.net 3.5 _8
 
Cai tien trong lenh t sql cua sql server 2008 (2)
Cai tien trong lenh t sql cua sql server 2008 (2)Cai tien trong lenh t sql cua sql server 2008 (2)
Cai tien trong lenh t sql cua sql server 2008 (2)
 
Cập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vbCập nhật csdl ngay trên datagridview trong vb
Cập nhật csdl ngay trên datagridview trong vb
 
Mo hinh ado.net
Mo hinh ado.netMo hinh ado.net
Mo hinh ado.net
 
access
accessaccess
access
 
LinQ
LinQLinQ
LinQ
 
Asp.net 3.5 _7
Asp.net 3.5 _7Asp.net 3.5 _7
Asp.net 3.5 _7
 

6.adapterset

  • 1. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 Ở 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 Page 1 of 25
  • 2. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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. Page 2 of 25
  • 3. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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 : Page 3 of 25
  • 4. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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 Page 4 of 25
  • 5. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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) 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ư Page 5 of 25
  • 6. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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; 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]); Page 6 of 25
  • 7. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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 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. Page 7 of 25
  • 8. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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(); 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 Page 8 of 25
  • 9. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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(); } } } Page 9 of 25
  • 10. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 } [/code] 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‟. Page 10 of 25
  • 11. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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] 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 ! Page 11 of 25
  • 12. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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ỉ? “ 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 Page 12 of 25
  • 13. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 [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++) { Console.Write(drv[i] + "t"); } Console.WriteLine(""); } } catch (Exception e) Page 13 of 25
  • 14. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 { // 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] Page 14 of 25
  • 15. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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 * FROM employees WHERE country = 'UK' "; // 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, "employees"); // Lấy thông tin Table vào DataTable DataTable dt = ds.Tables["employees"]; // Cột FirstName có thể Null dt.Columns["FirstName"].AllowDBNull = true; // Thay đổi City của Row đầu tiên dt.Rows[0]["City"] = "Seoul"; // Thêm một dòng mới nha DataRow newRow = dt.NewRow(); newRow["FirstName"] = "Pete"; newRow["LastName"] = "Houston"; newRow["TitleOfCourtesy"] = "Sir"; newRow["City"] = "Seoul"; newRow["Country"] = "South Korea"; dt.Rows.Add(newRow); // Add xong hiển thị thông tin từ DataSet ra màn hình xem // đã update chưa Page 15 of 25
  • 16. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 foreach (DataRow row in dt.Rows) { Console.WriteLine("{0} {1} {2}", row["FirstName"].ToString().PadRight(10), row["LastName"].ToString().PadLeft(10), row["City"]); } } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } } } } [/code] Run code trên xong, bạn thấy kết quả dòng trên cùng City là „Seoul‟ và dưới cùng là một dòng mới, đó chính là thông tin của newRow đã thêm. Ở đây có thay đổi settings của Table, mặc định thì cột FirstName không được Null, mình ở đây sửa lại phát cho phép null luôn, và thay đổi dòng đầu tiên ở cột City. Sau đó thêm dòng mới vào DataSet. Chắc không có gì nói nhiều về cái này nhỉ. Thay đổi dữ liệu trong Data Source Quay về Adapter, để update thông tin thì ta dùng các thuộc tính : UpdateCommand, InsertCommand, DeleteCommand, còn SelectCommand thì không phải vì nó cung cấp SqlCommand để thực thi và chẳng ảnh hưởng gì đến xã hội cơ sở dữ liệu :D. Thuộc tính UpdateCommand Như tên gọi đã nói lên đây là thực hiện Statement thay đổi dữ liệu trong database hay là câu lệnh UPDATE….SET Page 16 of 25
  • 17. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 Ví dụ thưc hiện Update : [code] da.UpdateCommand = new SqlCommand(“UPDATE employees SET city = „” + dt.Rows[0][“city”] + “‟ WHERE employeeid = „” + dt.Rows[0][“employeeid”] + “‟ “ , conn); // Thay đổi dữ liệu của bảng employee lên database source da.Update(ds, “employees”); [/code] Dưới đây tớ làm ví dụ minh họa sử dụng luôn, tớ sẽ xài tham số trong lệnh truyền vào SQL cho thực dụng …hehe [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 qry = @"SELECT * FROM employees WHERE country = 'UK' "; string upd = @"UPDATE employees SET city = @city WHERE employeeid = @employeeid "; // Tạo connection Page 17 of 25
  • 18. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(qry, conn); // Tạo và lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "employees"); // Lấy thông tin Table vào DataTable DataTable dt = ds.Tables["employees"]; // Sửa dòng đàu tiên dt.Rows[0]["city"] = "Seoul"; // In ra màn hình xem sự thay đổi trong DataSet foreach (DataRow row in dt.Rows) { Console.WriteLine("{0} {1} {2}", row["firstname"].ToString().PadLeft(14), row["lastname"].ToString().PadRight(15), row["city"]); } // Tiến hành update vào database Source // tạo command trước SqlCommand cmd = new SqlCommand(upd, conn); // Xử lý các Parameter trong command cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city"); SqlParameter param = cmd.Parameters.Add("@employeeid", SqlDbType.Int, 4, "employeeid"); param.SourceVersion = DataRowVersion.Original; // UPDATE da.UpdateCommand = cmd; da.Update(ds, "employees"); } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối Page 18 of 25
  • 19. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 conn.Close(); } } } } [/code] Để biết code trên ra kết quả thế nào thì, mở SQL Server Management Studio 2005 Express ra rồi run query sau : [code] use Northwind SELECT firstname,lastname,city FROM employees WHERE country = 'UK' [/code] Bạn sẽ thu được các value cần thiết. Sau đó run code ở trên, rồi run lại query SQL trên, sẽ thấy dòng trên cùng city sẽ bị thay đổi thành Seoul. Thuộc tính InsertCommand Ví dụ thử Insert thêm một dòng heng [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 qry = @"SELECT * FROM employees WHERE country = 'UK' "; Page 19 of 25
  • 20. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 string ins = @"INSERT INTO employees (firstname, lastname, titleofcourtesy, city, country) VALUES (@firstname, @lastname, @titleofcourtesy, @city, @country) "; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(qry, conn); // Tạo và lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "employees"); // Lấy thông tin Table vào DataTable DataTable dt = ds.Tables["employees"]; // Tạo thêm row mới DataRow newRow = dt.NewRow(); newRow["firstname"] = "Pete"; newRow["lastname"] = "Houston"; newRow["titleofcourtesy"] = "Sir"; newRow["city"] = "Seoul"; newRow["country"] = "South Korea"; dt.Rows.Add(newRow); // Hiển thị thông tin các rows trong DataSet foreach (DataRow row in dt.Rows) { Console.WriteLine("{0} {1} {2}", row["firstname"].ToString().PadRight(15), row["lastname"].ToString().PadLeft(15), row["city"]); } // Làm việc với Insert SqlCommand cmd = new SqlCommand(ins, conn); cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10, "firstname"); cmd.Parameters.Add("@lastname", SqlDbType.NVarChar, 20, "lastname"); cmd.Parameters.Add("@titleofcourtesy", SqlDbType.NVarChar, 25, "titleofcourtesy"); Page 20 of 25
  • 21. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city"); cmd.Parameters.Add("@country", SqlDbType.NVarChar, 15, "country"); // Tiến hành insert vào database Source da.InsertCommand = cmd; da.Update(ds, "employees"); } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } } } } [/code] Rất đơn giản nên mình không giải thích gì ở đây Thuộc tình DeleteCommand Cái này các bạn thử nghiệm tự viết code thực hành nhé. Giới thiệu về SqlCommandBuilder Nhìn lại các code ở trên để update dữ liệu lên DataSource công nhận quá dài và „hơi bị NẢN‟ khi viết code. Mệt nhất là khoản debug, quá rắc rồi và phức tạp. Vì vậy mà thằng cu SqlCommandBuilder trong họ đã ra đời để phục vụ việc tạo các statement „INSERT, UPDATE, DELETE‟ một cách tự động. Thêm chú ý là sau khi thay đổi thông tin trên data source thì bạn phải gọi method „RefreshSchema‟ của commandbuilder để cập nhật thông tin của metadata tương ứng. Page 21 of 25
  • 22. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 Làm ví dụ thêm một dòng vào database dùng SqlCommandBuilder nha [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 qry = @"SELECT * FROM employees WHERE country = 'UK' "; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(qry, conn); // Tạo commandbuider SqlCommandBuilder cb = new SqlCommandBuilder(da); // Tạo và lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "employees"); // Lấy thông tin Table vào DataTable DataTable dt = ds.Tables["employees"]; // Tạo thêm row mới DataRow newRow = dt.NewRow(); newRow["firstname"] = "Pete"; newRow["lastname"] = "Houston"; newRow["titleofcourtesy"] = "Sir"; newRow["city"] = "Seoul"; newRow["country"] = "South Korea"; dt.Rows.Add(newRow); Page 22 of 25
  • 23. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 // Hiển thị thông tin các rows trong DataSet foreach (DataRow row in dt.Rows) { Console.WriteLine("{0} {1} {2}", row["firstname"].ToString().PadRight(15), row["lastname"].ToString().PadLeft(15), row["city"]); } da.Update(ds, "employees"); } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } } } } [/code] Thấy hay không? Dùng SqlCommandBuilder thì bỏ đi được bao nhiêu đoạn cần thiết. So sánh với bài InsertCommand ở trên chắc là ngắn hơn được ¼ mà đọc code dễ hiểu hơn. DataSet và XML Bạn muốn extract dữ liệu trong DataSet ra một file định dạng XML ? Liệu có cần đòi hỏi kiến thức XML để làm việc ?...heheh . Không cần biết về XML vẫn extract được Một ví dụ viết lưu dữ liệu trong DataSet dưới dạng XML. [code] Page 23 of 25
  • 24. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 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 qry = @"SELECT firstname,lastname, city FROM employees WHERE country = 'UK' "; // Tạo connection SqlConnection conn = new SqlConnection(connString); try { // Tạo Adapter SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand = new SqlCommand(qry, conn); // Tạo commandbuider SqlCommandBuilder cb = new SqlCommandBuilder(da); // Tạo và lấp đầy DataSet DataSet ds = new DataSet(); da.Fill(ds, "employees"); // Extract ra file dưới dạng XML ds.WriteXml(@"P:database.xml"); } catch (Exception e) { // Bắt lỗi Console.WriteLine(e.Message); } finally { // Đóng kết nối conn.Close(); } Page 24 of 25
  • 25. Sử dụng DataAdapter và DataSet Author : Xcross87 2007 } } } [/code] Sau đó check file „database.xml‟ như đặt trên trong code kiểm tra ^_^. Bạn sẽ thấy thẻ <NewDataSet> chính là name của DataSet. Bạn có thể tùy ý thay đổi DataSetName Thêm một chú ý nữa : bạn có thể dùng DataTable để lấy thông tin trong bảng từ DataAdapter thông qua method Fill da.Fill(dt); Trong ADO.NET có một thành phần rất đặc biệt có tên là Typed DataSet. Mình sẽ nói về cái này sau. Bài viết có lẽ quá dài nên kết thúc ở đây. Page 25 of 25