Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 38 kết quả

Đề tài: Làm việc với DataSet và DataAdapter

  1. #1
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

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

    Ở 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.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		photo1.jpg
Lần xem:	860
Size:		23.3 KB
ID:		5094

    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.
    Tương quan 3 lớp như thế này :
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		photo2.jpg
Lần xem:	741
Size:		8.5 KB
ID:		5095

    Có 4 cách tạo DataAdapter :
    Visual C# Code:
    1. // Cách 1 : Đơn giản chỉ khai báo tạo đối tượng Adapter
    2. SqlDataAdapter da = new SqlDataAdapter();
    3. //  Cách 2 : Thiết lập đối tượng SqlCommand
    4. SqlDataAdapter da = new SqlDataAdapter(cmd);
    5. // Cách 3 : Thiết lập query và đối tượng SqlConnection
    6. SqlDataAdapter da = new SqlDataAdaoter(sql, conn);
    7. // Cách 4 : Thiết lập query và mệnh lệnh thực thi
    8. 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)
    DataColumn là tập hợp các hàng cùng một đặc tính. (Field)
    Ví dụ :
    Visual C# Code:
    1. DataTable dt =  new DataTable();
    2. DataColumn col = dt.Columns[“Contact”]; // Cột Contact
    3. DataColumn col = dt.Columns[2];
    4. DataRow row = dt.Rows[2];

    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 :
    Visual C# Code:
    1. DataSet ds = new DataSet();
    2. DataSet ds = new DataSet(“DataSet Name”);
    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ụ :
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query
    16.             string sql = @"SELECT productname, unitprice FROM products WHERE unitprice < 20";
    17.             // Tạo connection
    18.             SqlConnection conn = new SqlConnection(connString);
    19.             try
    20.             {
    21.                 // Mỏ kết nối
    22.                 conn.Open();
    23.                 // Tạo Adapter
    24.                 SqlDataAdapter da = new SqlDataAdapter(sql, conn);
    25.                 // Tạo DataSet
    26.                 DataSet ds = new DataSet();
    27.                 // Lấp đầy kết quả vào DataSet
    28.                 da.Fill(ds, "products");
    29.                 // Tạo DataTable thu kết quả từ bảng
    30.                 DataTable dt = ds.Tables["products"];
    31.                 // In kết quả ra Console
    32.                 foreach (DataRow row in dt.Rows)
    33.                 {
    34.                     foreach (DataColumn col in dt.Columns)
    35.                         Console.WriteLine(row[col]);
    36.                     Console.WriteLine("".PadLeft(20, '='));
    37.                 }
    38.             }
    39.             catch (Exception e)
    40.             {
    41.                 // Bắt lỗi
    42.                 Console.WriteLine(e.Message);
    43.             }
    44.             finally
    45.             {
    46.                 // Đóng kết nối
    47.                 conn.Close();
    48.             }
    49.         }
    50.     }
    51. }
    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 :

    Visual C# Code:
    1. // Tạo Adapter
    2.             SqlDataAdapter da = new SqlDataAdapter();
    3.             da.SelectCommand = new SqlCommand(sql, conn);
    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 :

    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query
    16.             string sql1 = @"SELECT * FROM customers ";
    17.             string sql2 = @"SELECT * FROM products WHERE unitprice < 10 ";
    18.             // Trộn 2 query vào làm 1
    19.             string sql = sql1 + sql2;            
    20.             // Tạo connection
    21.             SqlConnection conn = new SqlConnection(connString);
    22.             try
    23.             {                
    24.                 // Tạo Adapter
    25.                 SqlDataAdapter da = new SqlDataAdapter();
    26.                 da.SelectCommand = new SqlCommand(sql, conn);
    27.  
    28.                 // Tạo và lấp đầy DataSet
    29.                 DataSet ds = new DataSet();
    30.                 da.Fill(ds, "customers");
    31.  
    32.                 // Lấy Data Table Collection
    33.                 DataTableCollection dtc = ds.Tables;
    34.  
    35.                 // Xử lý Table thứ nhất
    36.                 Console.WriteLine("Result from Customers table : ");
    37.                 Console.WriteLine("Company Name".PadRight(20) + "Contact Name".PadLeft(23) + "\n");
    38.                 // Thiệt lập Filter
    39.                 string filter = "country = 'Germany'";
    40.                 // Thiết lập Sort
    41.                 string sort = "companyname ASC";
    42.                 // Hiển thị thông tin đã sort và filter
    43.                 foreach (DataRow row in dtc["customers"].Select(filter, sort))
    44.                 {
    45.                     Console.WriteLine("{0}\t{1}",
    46.                                       row["companyname"].ToString().PadRight(20),
    47.                                       row["contactname"]);
    48.                 }
    49.  
    50.                 // Xử lý table thứ hai
    51.                 Console.WriteLine("\n---------------------------");
    52.                 Console.WriteLine("Result from Products table");
    53.                 Console.WriteLine("ProductName".PadRight(20) + "UnitPrice".PadLeft(21) + "\n");
    54.                 // Hiển thị thông tin
    55.                 foreach (DataRow row in dtc[1].Rows)
    56.                 {
    57.                     Console.WriteLine("{0}\t{1}",
    58.                                     row["productname"].ToString().PadRight(25),
    59.                                     row["unitprice"]);
    60.                 }
    61.  
    62.             }
    63.             catch (Exception e)
    64.             {
    65.                 // Bắt lỗi
    66.                 Console.WriteLine(e.Message);
    67.             }
    68.             finally
    69.             {
    70.                 // Đóng kết nối
    71.                 conn.Close();
    72.             }
    73.            
    74.         }
    75.     }
    76. }

    Hay à nha…
    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 :
    Visual C# Code:
    1.     da.Fill(ds, “customers”);
    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
    Visual C# Code:
    1.     Console.WriteLine(ds.Tables[0]);
    2.                 Console.WriteLine(ds.Tables[1]);
    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 :
    Visual C# Code:
    1. ds.Tables[1].TableName = “products”;
    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”);
    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ỉ? “
    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
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string sql = @"SELECT contactname, country FROM customers ";
    17.             // Tạo connection
    18.             SqlConnection conn = new SqlConnection(connString);
    19.             try
    20.             {                
    21.                 // Tạo Adapter
    22.                 SqlDataAdapter da = new SqlDataAdapter();
    23.                 da.SelectCommand = new SqlCommand(sql, conn);
    24.  
    25.                 // Tạo và lấp đầy DataSet
    26.                 DataSet ds = new DataSet();
    27.                 da.Fill(ds, "customers");
    28.                 // Lấy thông tin Table vào DataTable
    29.                 DataTable dt = ds.Tables["customers"];
    30.                 // Tạo DataView
    31.                 DataView dv = new DataView(dt, "country = 'Germany'", "country", DataViewRowState.CurrentRows);
    32.                 // Hiển thị thông tin trong DataView
    33.                 foreach (DataRowView drv in dv)
    34.                 {
    35.                     for (int i = 0; i < dv.Table.Columns.Count; i++)
    36.                     {
    37.                         Console.Write(drv[i] + "\t");                        
    38.                     }
    39.                     Console.WriteLine("");
    40.                 }
    41.             }
    42.             catch (Exception e)
    43.             {
    44.                 // Bắt lỗi
    45.                 Console.WriteLine(e.Message);
    46.             }
    47.             finally
    48.             {
    49.                 // Đóng kết nối
    50.                 conn.Close();
    51.             }
    52.            
    53.         }
    54.     }
    55. }
    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.
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string sql = @"SELECT * FROM employees WHERE country = 'UK' ";
    17.             // Tạo connection
    18.             SqlConnection conn = new SqlConnection(connString);
    19.             try
    20.             {                
    21.                 // Tạo Adapter
    22.                 SqlDataAdapter da = new SqlDataAdapter();
    23.                 da.SelectCommand = new SqlCommand(sql, conn);
    24.  
    25.                 // Tạo và lấp đầy DataSet
    26.                 DataSet ds = new DataSet();
    27.                 da.Fill(ds, "employees");
    28.                 // Lấy thông tin Table vào DataTable
    29.                 DataTable dt = ds.Tables["employees"];
    30.                
    31.                 // Cột FirstName có thể Null
    32.                 dt.Columns["FirstName"].AllowDBNull = true;
    33.                 // Thay đổi City của Row đầu tiên
    34.                 dt.Rows[0]["City"] = "Seoul";
    35.                 // Thêm một dòng mới nha
    36.                 DataRow newRow = dt.NewRow();
    37.                 newRow["FirstName"] = "Pete";
    38.                 newRow["LastName"] = "Houston";
    39.                 newRow["TitleOfCourtesy"] = "Sir";
    40.                 newRow["City"] = "Seoul";
    41.                 newRow["Country"] = "South Korea";
    42.                 dt.Rows.Add(newRow);
    43.  
    44.                 // Add xong hiển thị thông tin từ DataSet ra màn hình xem
    45.                 // đã update chưa
    46.  
    47.                 foreach (DataRow row in dt.Rows)
    48.                 {
    49.                     Console.WriteLine("{0} {1} {2}",
    50.                             row["FirstName"].ToString().PadRight(10),
    51.                             row["LastName"].ToString().PadLeft(10),
    52.                             row["City"]);
    53.                 }
    54.             }
    55.             catch (Exception e)
    56.             {
    57.                 // Bắt lỗi
    58.                 Console.WriteLine(e.Message);
    59.             }
    60.             finally
    61.             {
    62.                 // Đóng kết nối
    63.                 conn.Close();
    64.             }
    65.            
    66.         }
    67.     }
    68. }

    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 .
    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
    Ví dụ thưc hiện Update :
    Visual C# Code:
    1. da.UpdateCommand = new SqlCommand(“UPDATE employees
    2.                         SET city = ‘” + dt.Rows[0][“city”] + “’
    3.                        WHERE employeeid = ‘” + dt.Rows[0][“employeeid”] + “’ “
    4.                         , conn);
    5. // Thay đổi dữ liệu của bảng employee lên database source
    6. da.Update(ds, “employees”);
    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
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string qry = @"SELECT * FROM employees WHERE country = 'UK' ";
    17.             string upd = @"UPDATE employees SET city = @city WHERE employeeid = @employeeid ";
    18.  
    19.             // Tạo connection
    20.             SqlConnection conn = new SqlConnection(connString);
    21.             try
    22.             {                
    23.                 // Tạo Adapter
    24.                 SqlDataAdapter da = new SqlDataAdapter();
    25.                 da.SelectCommand = new SqlCommand(qry, conn);
    26.  
    27.                 // Tạo và lấp đầy DataSet
    28.                 DataSet ds = new DataSet();
    29.                 da.Fill(ds, "employees");
    30.                 // Lấy thông tin Table vào DataTable
    31.                 DataTable dt = ds.Tables["employees"];
    32.  
    33.                 // Sửa dòng đàu tiên
    34.                 dt.Rows[0]["city"] = "Seoul";
    35.                 // In ra màn hình xem sự thay đổi trong DataSet
    36.                 foreach (DataRow row in dt.Rows)
    37.                 {
    38.                     Console.WriteLine("{0} {1} {2}",
    39.                         row["firstname"].ToString().PadLeft(14),
    40.                         row["lastname"].ToString().PadRight(15),
    41.                         row["city"]);
    42.                 }
    43.  
    44.                 // Tiến hành update vào database Source
    45.                 // tạo command trước
    46.                 SqlCommand cmd = new SqlCommand(upd, conn);
    47.                 // Xử lý các Parameter trong command
    48.                 cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city");
    49.                 SqlParameter param = cmd.Parameters.Add("@employeeid", SqlDbType.Int, 4, "employeeid");
    50.                 param.SourceVersion = DataRowVersion.Original;
    51.  
    52.                 // UPDATE
    53.                 da.UpdateCommand = cmd;
    54.                 da.Update(ds, "employees");                
    55.             }
    56.             catch (Exception e)
    57.             {
    58.                 // Bắt lỗi
    59.                 Console.WriteLine(e.Message);
    60.             }
    61.             finally
    62.             {
    63.                 // Đóng kết nối
    64.                 conn.Close();
    65.             }
    66.            
    67.         }
    68.     }
    69. }
    Để 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'
    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.

    Mục lục:
    1. Giới thiệu cơ bản ngôn ngữ SQL
    2. Giới thiệu cơ bản về ADO.NET
    3. Tạo kết nối tới database
    4. Thực thi câu lệnh SQL
    5. Xử lý kết quả với Data Reader
    6. Cách xử lý dữ liệu với Data Adapter và DataSet
    7. Giới thiệu về DataBinding
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 03-08-2007 lúc 10:57 AM.
    None!

  2. #2
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Thuộc tính InsertCommand
    Ví dụ thử Insert thêm một dòng heng
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string qry = @"SELECT * FROM employees WHERE country = 'UK' ";
    17.             string ins = @"INSERT INTO employees (firstname, lastname, titleofcourtesy, city, country) VALUES
    18.                           (@firstname, @lastname, @titleofcourtesy, @city, @country) ";
    19.  
    20.  
    21.             // Tạo connection
    22.             SqlConnection conn = new SqlConnection(connString);
    23.             try
    24.             {                
    25.                 // Tạo Adapter
    26.                 SqlDataAdapter da = new SqlDataAdapter();
    27.                 da.SelectCommand = new SqlCommand(qry, conn);
    28.  
    29.                 // Tạo và lấp đầy DataSet
    30.                 DataSet ds = new DataSet();
    31.                 da.Fill(ds, "employees");
    32.                 // Lấy thông tin Table vào DataTable
    33.                 DataTable dt = ds.Tables["employees"];
    34.  
    35.                 // Tạo thêm row mới
    36.                 DataRow newRow = dt.NewRow();
    37.                 newRow["firstname"] = "Pete";
    38.                 newRow["lastname"] = "Houston";
    39.                 newRow["titleofcourtesy"] = "Sir";
    40.                 newRow["city"] = "Seoul";
    41.                 newRow["country"] = "South Korea";
    42.                 dt.Rows.Add(newRow);
    43.                 // Hiển thị thông tin các rows trong DataSet
    44.                 foreach (DataRow row in dt.Rows)
    45.                 {
    46.                     Console.WriteLine("{0} {1} {2}",
    47.                             row["firstname"].ToString().PadRight(15),
    48.                             row["lastname"].ToString().PadLeft(15),
    49.                             row["city"]);
    50.                 }
    51.  
    52.                 // Làm việc với Insert
    53.                 SqlCommand cmd = new SqlCommand(ins, conn);
    54.                 cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10, "firstname");
    55.                 cmd.Parameters.Add("@lastname", SqlDbType.NVarChar, 20, "lastname");
    56.                 cmd.Parameters.Add("@titleofcourtesy", SqlDbType.NVarChar, 25, "titleofcourtesy");
    57.                 cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city");
    58.                 cmd.Parameters.Add("@country", SqlDbType.NVarChar, 15, "country");
    59.                 // Tiến hành insert vào database Source
    60.                 da.InsertCommand = cmd;
    61.                 da.Update(ds, "employees");
    62.  
    63.                              
    64.             }
    65.             catch (Exception e)
    66.             {
    67.                 // Bắt lỗi
    68.                 Console.WriteLine(e.Message);
    69.             }
    70.             finally
    71.             {
    72.                 // Đóng kết nối
    73.                 conn.Close();
    74.             }
    75.            
    76.         }
    77.     }
    78. }

    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.
    Làm ví dụ thêm một dòng vào database dùng SqlCommandBuilder nha
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string qry = @"SELECT * FROM employees WHERE country = 'UK' ";            
    17.  
    18.             // Tạo connection
    19.             SqlConnection conn = new SqlConnection(connString);
    20.             try
    21.             {                
    22.                 // Tạo Adapter
    23.                 SqlDataAdapter da = new SqlDataAdapter();
    24.                 da.SelectCommand = new SqlCommand(qry, conn);
    25.  
    26.                 // Tạo commandbuider
    27.                 SqlCommandBuilder cb = new SqlCommandBuilder(da);
    28.  
    29.                 // Tạo và lấp đầy DataSet
    30.                 DataSet ds = new DataSet();
    31.                 da.Fill(ds, "employees");
    32.                 // Lấy thông tin Table vào DataTable
    33.                 DataTable dt = ds.Tables["employees"];
    34.  
    35.                 // Tạo thêm row mới
    36.                 DataRow newRow = dt.NewRow();
    37.                 newRow["firstname"] = "Pete";
    38.                 newRow["lastname"] = "Houston";
    39.                 newRow["titleofcourtesy"] = "Sir";
    40.                 newRow["city"] = "Seoul";
    41.                 newRow["country"] = "South Korea";
    42.                 dt.Rows.Add(newRow);
    43.                 // Hiển thị thông tin các rows trong DataSet
    44.                 foreach (DataRow row in dt.Rows)
    45.                 {
    46.                     Console.WriteLine("{0} {1} {2}",
    47.                             row["firstname"].ToString().PadRight(15),
    48.                             row["lastname"].ToString().PadLeft(15),
    49.                             row["city"]);
    50.                 }              
    51.                 da.Update(ds, "employees");                            
    52.             }
    53.             catch (Exception e)
    54.             {
    55.                 // Bắt lỗi
    56.                 Console.WriteLine(e.Message);
    57.             }
    58.             finally
    59.             {
    60.                 // Đóng kết nối
    61.                 conn.Close();
    62.             }
    63.            
    64.         }
    65.     }
    66. }
    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.
    Visual C# Code:
    1. using System;
    2. using System.Data;
    3. using System.Data.SqlClient;
    4.  
    5. namespace MSSQL_Server
    6. {
    7.     class Database
    8.     {
    9.         static void Main(string[] args)
    10.         {
    11.             // Tạo connection strin
    12.             string connString = @"Server = .\SQLEXPRESS;
    13.                                  Integrated Security = True;
    14.                                  Database = Northwind";
    15.             // Tạo SQL query            
    16.             string qry = @"SELECT firstname,lastname, city FROM employees WHERE country = 'UK' ";            
    17.  
    18.             // Tạo connection
    19.             SqlConnection conn = new SqlConnection(connString);
    20.             try
    21.             {                
    22.                 // Tạo Adapter
    23.                 SqlDataAdapter da = new SqlDataAdapter();
    24.                 da.SelectCommand = new SqlCommand(qry, conn);
    25.  
    26.                 // Tạo commandbuider
    27.                 SqlCommandBuilder cb = new SqlCommandBuilder(da);
    28.  
    29.                 // Tạo và lấp đầy DataSet
    30.                 DataSet ds = new DataSet();
    31.                 da.Fill(ds, "employees");
    32.                 // Extract ra file dưới dạng XML
    33.                 ds.WriteXml(@"P:\database.xml");
    34.                                        
    35.             }
    36.             catch (Exception e)
    37.             {
    38.                 // Bắt lỗi
    39.                 Console.WriteLine(e.Message);
    40.             }
    41.             finally
    42.             {
    43.                 // Đóng kết nối
    44.                 conn.Close();
    45.             }
    46.            
    47.         }
    48.     }
    49. }
    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.
    None!

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    6

    "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)"

    Chắc bác viết dài quá nên chỗ này bị lộn. Hì.

  4. #4
    Ngày gia nhập
    12 2008
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi tinhnd Xem bài viết
    "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)"

    Chắc bác viết dài quá nên chỗ này bị lộn. Hì.
    Chưa chắc đã lộn đâu bạn

  5. #5
    Ngày gia nhập
    04 2009
    Bài viết
    5

    chào bác mình thấy bác rành ve c# quá, cho mình hỏi cách đưa dữ liêu lên datagirdview mình bấm vào mũi tên bên phải thì cũng được nhưng sang máy khác ko được, khi mình addcolum ở datagird cái cột thêm vào nó không nằm trong một bảng mà nằm trong nhiều bảng thì mình phải làm sao? bạn có thể viết hoàn chỉnh, tỉ mỉ cho mình đoạn code ấy ko ? mình cần tham khảo. cám ơn các bác nhá.

  6. #6
    Ngày gia nhập
    08 2009
    Nơi ở
    Hà nội
    Bài viết
    2

    Thumbs down cho em hỏi với

    em đọc bài viết này thấy rất hay, nhưng em không làm thế nào để chạy được. Em mở VS sau đó tạo 1 form WF mới, rùi copy code của các anh chị vào sự kiện FormLoad(), sau đó em gọi lại form này trong file Program.cs nhưng nó chẳng chạy gì cả cũng ko thấy báo lỗi, như thế là sao ạ ? em mới học WF nên chưa biết nhiều, mong được sự giúp đỡ của các anh chị ạ. Em chân thành cảm ơn. replay lại cho em nhé ^^

  7. #7
    Ngày gia nhập
    07 2009
    Bài viết
    97

    Thanks!
    Bài viết rất hay. Nếu mình đọc bài này sớm hơn thì mình đã nhiều thời gian uống cafe khi làm đề tài môn CNPM rùi

  8. #8
    Ngày gia nhập
    12 2008
    Bài viết
    80

    Thumbs down Cho hỏi Command mà có dấu @ ?

    Những câu lệnh có dấu @ là tượng trưng cho store procedure phải ko? và nó khác như thế nào với 1 câu lệnh select,from,where bình thường?

  9. #9
    Ngày gia nhập
    10 2009
    Bài viết
    38

    anh ơi cho e hỏi. em có câu lệnh truy vấn SQL như thế này
    SqlDataAdapter da = new SqlDataAdapter("select sinhvien.masv, ho, ten, diemlam1, diemlan2 from sinhvien inner join diem on sinhvien.masv=diem.masv", conn);

    DataSet ds = new DataSet();

    da.Fill(ds, "...................");

    thì trong cái .................... e phải khai báo thế nào a.

  10. #10
    Ngày gia nhập
    06 2009
    Nơi ở
    Cái hộp
    Bài viết
    1,255

    Chỉ có 4 overload thôi, nếu bạn làm theo cách đầu thì ko cần truyền gì vào cả.
    Fill(DataSet)
    Fill(DataTable, IDataReader)
    Fill(DataTable(), IDataReader, Int32, Int32)
    Fill(DataSet, String, IDataReader, Int32, Int32)
    Men talk of killing time, while time quietly kills them.
    Time is what we want most, but what we use worst.
    ------------------------------
    YinYang's Programming Blog

Các đề tài tương tự

  1. Dataadapter.update + Datagridview!
    Gửi bởi phuochau trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 25-08-2013, 07:43 PM
  2. Trả lời: 0
    Bài viết cuối: 15-04-2013, 11:33 PM
  3. ADO.NET Tạo 1 DataAdapter làm cầu nối cho nhiều table trong C# có được không?
    Gửi bởi MYNAM trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 24-04-2012, 04:52 PM
  4. Database Dùng DataAdapter update multi table , có cách nào không ?
    Gửi bởi longhai1311 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 16-11-2011, 03:10 PM
  5. Database Làm sao đưa ràng buộc vào dataset
    Gửi bởi sieutanbinh1711 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 25-04-2011, 11:19 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn