(ADO.NET) DataAdapter DataSet Và DataTable Tìm Hiểu Và Sử Dụng
Có thể bạn quan tâm
- DataAdapter, DataSet, DataTable
- DataSet
- DataTable
- DataAdapter
- Một ví dụ trong WPF với DataAdapter
DataAdapter, DataSet, DataTable
DataSet
DataSet là một cấu trúc phức tạp, thành phần cơ bản của ADO.NET. Nó ánh xạ CSDL nguồn (SQL Database) vào thành các đối tượng trong bộ nhớ. DataSet chứa trong nó là tập hợp các đối tượng DataTable.
Khởi tạo ra một đối tượng DataSet
DataSet dataSet = new DataSet();DataTable
DataTable là đối tượng chứa dữ liệu, nó có tên, các dòng, cột qua đó nó là ánh xạ của một bảng (Table) của CSDL.
Một vài đoạn code về DataTable như:
// Khởi tạo bảng với tên MyTable DataTable table = new DataTable("MyTable"); // Thêm các cột vào bảng table.Columns.Add("STT"); table.Columns.Add("HoTen"); table.Columns.Add("Tuoi"); // Thêm dòng liệu vào cột table.Rows.Add(1, "XuanThuLab", 25); // Dòng thứ nhất table.Rows.Add(2, "Nguyen Van A", 23); // Dòng thứ hai table.Rows.Add(3, "Nguyen Van B", 20); // Dòng thứ ba // Duyệt qua các cột, in tên cột Console.WriteLine($"Bảng {table.TableName}"); foreach (DataColumn c in table.Columns) { Console.Write($"{c.ColumnName, 20}"); } Console.WriteLine(); // Duyệt qua các dòng và in dữ liệu cột for (int i = 0; i < table.Rows.Count; i++) { Console.Write($"{table.Rows[i][0], 20}"); // Cột 0, hàng i Console.Write($"{table.Rows[i]["HoTen"], 20}"); // Cột HoTen, hàng i Console.Write($"{table.Rows[i]["Tuoi"], 20}"); // Cột 2, hàng i Console.WriteLine(); } // Gán giá trị dữ liệu vào trường (cell) table.Rows[2]["HoTen"] = "Họ tên mới"; // Hoặc duyệt bằng foreach liệt kê các dòng Console.WriteLine(); foreach (DataRow r in table.Rows) { Console.Write($"{r[0], 20}"); Console.Write($"{r["HoTen"], 20}"); Console.Write($"{r["Tuoi"], 20}"); Console.WriteLine(); } // Bảng MyTable // STT HoTen Tuoi // 1 XuanThuLab 25 // 2 Nguyen Van A 23 // 3 Nguyen Van B 20 // 1 XuanThuLab 25 // 2 Nguyen Van A 23 // 3 Họ tên mới 20DataTable có thể đưa vào trong DataSet, ví dụ
dataSet.Tables.Add(table);Xây dựng phương thực hiện thị dữ liệu DataTable để dùng cho các ví dụ sau:
static void ShowDataTable(DataTable table) { Console.WriteLine("Bảng: " + table.TableName); // Hiện thị các cột foreach (DataColumn column in table.Columns) { Console.Write($"{column.ColumnName, 15}"); } Console.WriteLine(); // Hiện thị các dòng dữ liệu int number_cols = table.Columns.Count; foreach (DataRow row in table.Rows) { for (int i = 0; i < number_cols; i++) { Console.Write($"{row[i], 15}"); } Console.WriteLine(); } }DataAdapter
DataAdapter là lớp tạo ra cầu nối giữa DataSet (các bảng) với nguồn dữ liệu (Database - Tabble) - từ đó có thể lấy dữ liệu nguồn về DataSet, dữ liệu được biên tập (insert, update, delete) trong DataSet - sau đó cập nhật trở lại nguồn.
Một đối tượng DataAdapter có các thuộc tính quan trọng để tạo ra các thao tác tương tác với Database như:
- SelectCommand thuộc tính chứa đối tượng SqlCommand, nó chạy khi lấy dữ liệu bằng cách gọi phương thực Fill
- InsertCommand thuộc tính chứa đối tượng SqlCommand, chạy khi thực hiện thêm dữ liệu
- UpdateCommand thuộc tính chứa đối tượng SqlCommand, chạy khi thực hiện cập nhật
- DeleteCommand thuộc tính chứa đối tượng SqlCommand, chạy khi thực hiện xóa dòng dữ liệu
Ví dụ: Bảng Nhanvien có các trường NhanviennID,Ten,Ho tạo DataAdapter làm cầu nối giữa DataSet và bảng đó
// Tạo kết nối var sqlconnectstring = @"Data Source=localhost,1433; Initial Catalog=xtlab; User ID=SA;Password=Password123"; var connection = new SqlConnection(sqlconnectstring); connection.Open(); // TẠO DataAdapter SqlDataAdapter adapter = new SqlDataAdapter(); // Thiết lập bảng trong DataSet ánh xạ tương ứng có tên là Nhanvien adapter.TableMappings.Add("Table", "Nhanvien"); // SelectCommand - Thực thi khi gọi Fill lấy dữ liệu về DataSet adapter.SelectCommand = new SqlCommand(@"SELECT NhanviennID,Ten,Ho FROM Nhanvien" ,connection); // InsertCommand - Thực khi khi gọi Update, nếu DataSet có chèn dòng mới (vào DataTable) // Dữ liệu lấy từ DataTable, như cột Ten tương ứng với tham số @Ten adapter.InsertCommand = new SqlCommand(@"INSERT INTO Nhanvien (Ten, Ho) VALUES (@Ten, @Ho)", connection); adapter.InsertCommand.Parameters.Add("@Ten", SqlDbType.NVarChar, 255, "Ten"); adapter.InsertCommand.Parameters.Add("@Ho", SqlDbType.NVarChar, 255, "Ho"); // DeleteCommand - Thực thi khi gọi Update, nếu có remove dòng nào đó của DataTable adapter.DeleteCommand = new SqlCommand(@"DELETE FROM Nhanvien WHERE NhanviennID = @NhanviennID", connection); var pr1 = adapter.DeleteCommand.Parameters.Add(new SqlParameter("@NhanviennID", SqlDbType.Int)); pr1.SourceColumn = "NhanviennID"; pr1.SourceVersion = DataRowVersion.Original; // Giá trị ban đầu // UpdateCommand - Thực thi khi gọi Update, nếu có chỉnh sửa trường dữ liệu nào đó adapter.UpdateCommand = new SqlCommand(@"UPDATE Nhanvien SET Ho=@Ho, Ten = @Ten WHERE NhanviennID = @NhanviennID", connection); adapter.UpdateCommand.Parameters.Add("@Ten", SqlDbType.NVarChar, 255, "Ten"); adapter.UpdateCommand.Parameters.Add("@Ho", SqlDbType.NVarChar, 255, "Ho"); var pr2 = adapter.UpdateCommand.Parameters.Add( new SqlParameter("@NhanviennID", SqlDbType.Int) { SourceColumn = "NhanviennID" }); pr2.SourceVersion = DataRowVersion.Original; DataSet dataSet = new DataSet(); // Thực hiện lấy dữ liệu từ nguồn về DataSet adapter.Fill(dataSet); // Lấy DataTable kết quả và hiện thị DataTable dataTable = dataSet.Tables["Nhanvien"]; ShowDataTable(dataTable); // Ví dụ thêm một dòng dữ liệu var rowadd = dataTable.Rows.Add(); rowadd["Ho"] = "Họ mới"; rowadd["Ten"] = "Tên mới"; adapter.Update(dataSet); // Nạp lại adapter.Fill(dataSet); // Ví dụ cập nhật dòng thứ 10 var rowedit = dataTable.Rows[10]; rowedit["Ho"] = "Nguyễn"; adapter.Update(dataSet); // Ví dụ xóa một dòng đữ thứ 10 var rowdelete = dataTable.Rows[10]; rowdelete.Delete(); adapter.Update(dataSet); connection.Close();Ví dụ áp dụng với ứng dụng WPF
NhanvienWindow.xaml
<Window x:Class="MyApp.NhanvienWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyApp" mc:Ignorable="d" Title="DadaAdapter" Height="329" Width="737" Loaded="NhanvienWindow_Loaded"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"></RowDefinition> <RowDefinition Height="30px"></RowDefinition> </Grid.RowDefinitions> <DataGrid x:Name="datagrid" Grid.Row="0" ItemsSource="{Binding}" /> <StackPanel Background="#FF7F8494" Grid.Row="1" Orientation="Horizontal"> <Button x:Name="btnLoad" Content="Load" Padding="20,0" Click="btnLoad_Click"></Button> <Button x:Name="btnSave" Content="Save" Padding="20,0" Click="btnSave_Click"></Button> <Button x:Name="btnDelete" Content="Delete" Padding="20,0" Click="btnDelete_Click"></Button> </StackPanel> </Grid> </Window>NhanvienWindow.cs
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace MyApp { public partial class NhanvienWindow : Window { DataTable dataTable = new DataTable("Nhanvien"); // Tạo kết nối String sqlconnectstring = @"Data Source=192.168.1.3,1433; Initial Catalog=xtlab; User ID=SA;Password=Password123"; SqlConnection connection; SqlDataAdapter adapter = new SqlDataAdapter(); DataSet dataSet = new DataSet(); public NhanvienWindow() { InitAdapter(); InitializeComponent(); } private void InitAdapter() { connection = new SqlConnection(sqlconnectstring); connection.Open(); // Thiết lập bảng trong DataSet ánh xạ tương ứng có tên là Nhanvien adapter.TableMappings.Add("Table", "Nhanvien"); // SelectCommand - Thực thi khi gọi Fill lấy dữ liệu về DataSet adapter.SelectCommand = new SqlCommand(@"SELECT NhanviennID,Ten,Ho FROM Nhanvien", connection); // InsertCommand - Thực khi khi gọi Update, nếu DataSet có chèn dòng mới (vào DataTable) // Dữ liệu lấy từ DataTable, như cột Ten tương ứng với tham số @Ten adapter.InsertCommand = new SqlCommand(@"INSERT INTO Nhanvien (Ten, Ho) VALUES (@Ten, @Ho)", connection); adapter.InsertCommand.Parameters.Add("@Ten", SqlDbType.NVarChar, 255, "Ten"); adapter.InsertCommand.Parameters.Add("@Ho", SqlDbType.NVarChar, 255, "Ho"); // DeleteCommand - Thực thi khi gọi Update, nếu có remove dòng nào đó của DataTable adapter.DeleteCommand = new SqlCommand(@"DELETE FROM Nhanvien WHERE NhanviennID = @NhanviennID", connection); var pr1 = adapter.DeleteCommand.Parameters.Add(new SqlParameter("@NhanviennID", SqlDbType.Int)); pr1.SourceColumn = "NhanviennID"; pr1.SourceVersion = DataRowVersion.Original; // Giá trị ban đầu // UpdateCommand - Thực thi khi gọi Update, nếu có chỉnh sửa trường dữ liệu nào đó adapter.UpdateCommand = new SqlCommand(@"UPDATE Nhanvien SET Ho=@Ho, Ten = @Ten WHERE NhanviennID = @NhanviennID", connection); adapter.UpdateCommand.Parameters.Add("@Ten", SqlDbType.NVarChar, 255, "Ten"); adapter.UpdateCommand.Parameters.Add("@Ho", SqlDbType.NVarChar, 255, "Ho"); var pr2 = adapter.UpdateCommand.Parameters.Add(new SqlParameter("@NhanviennID", SqlDbType.Int) { SourceColumn = "NhanviennID" }); pr2.SourceVersion = DataRowVersion.Original; dataSet.Tables.Add(dataTable); } private void LoadDataTable() { dataTable.Rows.Clear(); adapter.Fill(dataSet); } private void NhanvienWindow_Loaded(object sender, RoutedEventArgs e) { LoadDataTable(); datagrid.DataContext = dataTable.DefaultView; } private void btnSave_Click(object sender, RoutedEventArgs e) { adapter.Update(dataSet); dataTable.Rows.Clear(); adapter.Fill(dataSet); } private void btnDelete_Click(object sender, RoutedEventArgs e) { DataRowView selectedItem = (DataRowView)datagrid.SelectedItem; if (selectedItem != null) { selectedItem.Delete(); } } private void btnLoad_Click(object sender, RoutedEventArgs e) { LoadDataTable(); datagrid.DataContext = dataTable.DefaultView; } } } Mục lục bài viết DataAdapter, DataSet, DataTableDataSetDataTableDataAdapterMột ví dụ trong WPF với DataAdapter ĐĂNG KÝ KÊNH, XEM CÁC VIDEO TRÊN XUANTHULAB Đăng ký nhận bài viết mớiTừ khóa » Duyệt Từng Dòng Trong Datatable C#
-
Hỏi: Duyệt Giá Trị Từng Dòng Trong Databse Như Nào - Cộng đồng C Việt
-
Chủ đề: Duyệt Từng Dòng Trên DataTable...Help! - Diễn Đàn Tin Học
-
Vấn đề Duyệt Tất Cả Các Dòng Trên Cơ Sở Dữ Liệu Trong C#
-
Thay đổi Các Bản Ghi Của Cơ Sở Dữ Liệu
-
Tìm Hiểu C# Và ứng Dụng: Khởi Sự Với ADO.NET
-
Làm Cách Nào để Lấy Tên Cột để In Trong Chương Trình C # Này?
-
Sử Dụng DataView để Filter Dữ Liệu Từ DataTable C - Lập Trình .NET
-
Cách Loại Bỏ Các DataRow Bị Trùng Trong DataTable C
-
[BÀI 2] Đơn Giản Hóa Lập Trình Với Cơ Sở Dữ Liệu (ADO.NET) - Sử ...
-
Học Lập Trình C# – Lấy Danh Sách Server Trong SQL
-
Hướng Dẫn Sử Dụng DataReader, DataSet, DataAdapter And ...
-
DataTable.Select Method (System.Data) - Microsoft Docs
-
Lập Trình C# - TRUSTWEB.VN
-
ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG ...