DataTable là 1 kiểu dữ liệu rất lâu đời, kể từ NetFrameword 1.0, nhưng mang hiệu quả trong lập trình rất lớn, chỉ những lập trình viên lâu năm sẽ nhận ra điều này khi xây dựng phần mềm thương mại.
DotNet mới bây giờ ra quá nhiều kiễu dữ liệu nhưng bản chất nó đều mang lại lợi ích như nhau.
Tôi viết bài này để các lập trình viên tham khảo cách sử dụng DataTable cực hay do Microsoft cung cấp.
Để sử dụng được biến kiểu DataTable cần dùng namespace System.Data ;
Cách khai báo biến
DataTable Ten_BIEN = new DataTable();
* Ten_BIEN đặt tùy biến ko dấu cách, ko ký tự đặc biệt
Biến DataTable để làm gì ?
- Chứa đựng giá trị từ file text (ít lập trình viên sử dụng), xml (cấu trúc chặc chẽ), Excel, từ CSDL Access, CSDL SQL Server, Oracle...
Ví dụ 1: tạo biến DataTable đơn giản và thêm dữ liệu vào cho biến.
// khai báo biến dt kiểu DataTable
DataTable dt = new DataTable();
// thêm cột vào biến dt
dt.Columns.Add("Ma", typeof(int));
dt.Columns.Add("Ten", typeof(string));
// thêm giá trị vào biến DataTable cách 1
dt.Rows.Add(1, "Tran A");
dt.Rows.Add(2, "Tran B");
// thêm giá trị vào biến DataTable cách 1 (lần 1)
DataRow drAdd_01 = dt.NewRow();
drAdd_01["Ma"] = 3;
drAdd_01["Ten"] = "Le C";
dt.Rows.Add(drAdd_01);
// thêm giá trị vào biến DataTable cách 1 (lần 2)
DataRow drAdd_02 = dt.NewRow();
drAdd_02["Ma"] = 3;
drAdd_02["Ten"] = "Le C";
dt.Rows.Add(drAdd_02);
//cách lấy tổng dòng trong DataTable
int tongsodong = dt.Rows.Count;
//cách lấy giá trị 1 ô trong DataTable
string gt_dong1_cot2 = dt.Rows[0][1].ToString();
string gt_dong1_cot1 = dt.Rows[0]["Ma"].ToString();
// -> dòng đầu tiên trong DataTable là 0
// Cột lất có thể là chỉ số hay là tên cột
string ds_Cot_Ma = "";
for (int i = 0; i < tongsodong; i++)
{
ds_Cot_Ma += dt.Rows[i]["Ma"].ToString() + " ";
}
string ds_Cot_Ten = "";
foreach (DataRow drGet in dt.Rows)
{
ds_Cot_Ten += drGet["Ten"].ToString() + " ";
}
Console.WriteLine("Hello, World!");
Thêm cột dt.Columns.Add("Ten"); // không có gán kiểu thì mặc định là kiểu string
Ví dụ 2: tạo biến DataTable có dùng thêm biến DataColumn
Sử dụng DataColumn để thêm vào DataTable, có sử dụng Expression để tính
DataTable dt = new DataTable();
// biến kiểu DataColumn
DataColumn cl_1 = new DataColumn("STT", typeof(int));
DataColumn cl_2 = new DataColumn("HoTen", typeof(string));
DataColumn cl_3 = new DataColumn("Lop", typeof(string));
DataColumn cl_4 = new DataColumn("Toan", typeof(int));
DataColumn cl_5 = new DataColumn("Ly", typeof(int));
DataColumn cl_6 = new DataColumn("Tong", typeof(int),"Toan+Ly");
DataColumn cl_7 = new DataColumn("DiemTB", typeof(double), "(Toan+Ly)/2");
DataColumn cl_8 = new DataColumn("XepLoai", typeof(string), "iif(DiemTB>=8,'Gioi','Kha' ) ");
//
dt.Columns.Add(cl_1); //dt.Columns.Add("STT",typeof(int));
dt.Columns.Add(cl_2);
dt.Columns.Add(cl_3);
dt.Columns.Add(cl_4);
dt.Columns.Add(cl_5);
dt.Columns.Add(cl_6);
dt.Columns.Add(cl_7);
dt.Columns.Add(cl_8);
//
dt.Rows.Add(1,"A","Lop A",5,7);
dt.Rows.Add(2, "B", "Lop A", 8, 9);
dt.Rows.Add(3, "C", "Lop B", 8, 2);
dt.Rows.Add(4, "D", "Lop B", 8, 9);
dt.Rows.Add(5, "E", "Lop C", 8, 9);
Có nhiều cách thêm row vào table nhưng 3 cách dưới đây rất hay sử dụng để thêm row vào datatable
DataTable dt = new DataTable();
// biến kiểu DataColumn
DataColumn cl_1 = new DataColumn("STT", typeof(int));
DataColumn cl_2 = new DataColumn("HoTen", typeof(string));
DataColumn cl_3 = new DataColumn("Lop", typeof(string));
DataColumn cl_4 = new DataColumn("Diem", typeof(Double));
dt.Columns.Add(cl_1); //dt.Columns.Add("STT",typeof(int));
dt.Columns.Add(cl_2);
dt.Columns.Add(cl_3);
dt.Columns.Add(cl_4);
// Cách 1
dt.Rows.Add(1,"Tran A","FREE",5);
dt.Rows.Add(2, "Tran B", "FREE",7);
dt.Rows.Add(2, "Tran C", "FREE", 8);
// Cách 2
DataRow dr3 = dt.NewRow();
dr3["STT"] = 4;
dr3["HoTen"] = "Bui C";
dr3["Lop"] = "VIP";
dr3["Diem"] = 6;
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4["STT"] = 5;
dr4["HoTen"] = "Nguyen D";
dr4["Lop"] = "VIP";
dr4["Diem"] = 10;
dt.Rows.Add(dr4);
// Cách 3 thêm bằng FOR
for (int i = 6; i <= 10; i++)
{
DataRow dr_NEW = dt.NewRow();
dr_NEW["STT"] = i;
dr_NEW["HoTen"] = "Nguyen "+ i.ToString();
dr_NEW["Lop"] = "VIP";
dr_NEW["Diem"] = i-1;
dt.Rows.Add(dr_NEW);
}
Sử dụng dữ liệu của bài 3
// sử dụng Compute int tong = Convert.ToInt16(dt.Compute("SUM(Diem)", ""));
int tong_XepLoai_LopVIP = Convert.ToInt16(dt.Compute("SUM(Diem)", "Lop='VIP'"));
int diemThapNhat = Convert.ToInt16(dt.Compute("MIN(Diem)", ""));
int diemCaoNhat = Convert.ToInt16(dt.Compute("MAX(Diem)", ""));
double diemTrungBinh = Convert.ToDouble(dt.Compute("AVG(Diem)", ""));
Giống như trong Microsoft Access chúng ta tạo ra các view để truy cập đến table
Cú pháp:
DataView dv = dt.DefaultView;
Tạo view để làm gì ?
Sử dụng dữ liệu từ bài trên
//Sắp xếp
DataView dv_sx_tang = dt.DefaultView;
dv_sx_tang.Sort = "Diem DESC";
Console.WriteLine("------------------------");
Console.WriteLine("Danh sách Học viên có điểm thấp dần");
foreach (DataRow dr in dv_sx_tang.ToTable().Rows)
{
Console.WriteLine("Học viên: " + dr["HoTen"] + ", Diem: " + dr["Diem"]);
}
// Lọc dữ liệu theo lớp
DataView dv_vip = dt.DefaultView;
dv_vip.RowFilter = "Lop='VIP'";
Console.WriteLine("------------------------");
Console.WriteLine("Danh sách Học viên lớp VIP:");
foreach (DataRow dr in dv_vip.ToTable().Rows)
{
Console.WriteLine("Học viên: " + dr["HoTen"] + ", lop: " + dr["Lop"]);
}
// Lọc dữ liệu có sử dụng LIKE
DataView dv_tenHoTran = dt.DefaultView;
dv_tenHoTran.RowFilter = "HoTen Like 'Tran%'";
Console.WriteLine("------------------------");
Console.WriteLine("Danh sách Học viên họ TRAN");
foreach (DataRow dr in dv_vip.ToTable().Rows)
{
Console.WriteLine("Học viên: " + dr["HoTen"] + ", lop: " + dr["Lop"]);
}
// Nhóm dữ liệu Distinct
DataView dv_nhomLop = dt.DefaultView;
dv_nhomLop.RowFilter = "";
DataTable dt_Lop = dv_nhomLop.ToTable(true, "Lop");
Console.WriteLine("------------------------");
Console.WriteLine("Danh sách TÊN LỚP:");
foreach (DataRow dr in dt_Lop.Rows)
{
Console.WriteLine("LỚP: " + dr["Lop"] );
}
Cũng giống DataView nhưng phương thức Select trả về 1 mảng DataRow
DataRow[] getRow = dt.Select("Lop='Vip'","Diem DESC");
Console.WriteLine("------------------------");
Console.WriteLine("Sử dụng Select ");
foreach (DataRow dr in getRow)
{
Console.WriteLine("Học viên: " + dr["HoTen"] + ", lop: " + dr["Lop"]);
}
Ứng dụng LINQ trong DataTable giúp bạn thao tác dữ liệu giống như truy vấn SQL – rất mạnh mẽ, ngắn gọn, rõ ràng. Dưới đây là phần trình bày từ cơ bản đến nâng cao, phù hợp cả cho người học và người áp dụng thực tế trong WinForms, WPF, ASP.NET, v.v.
Bạn phải gọi .AsEnumerable() để biến DataTable thành một tập hợp Enumerable<DataRow> – từ đó có thể dùng được LINQ.
using System.Linq;
using System.Data;
DataTable dt = ...; // đã có sẵn dữ liệu
var ketQua = dt.AsEnumerable()
.Where(row => row.Field<string>("HoTen").Contains("Nam"))
.OrderBy(row => row.Field<DateTime>("NgaySinh"));
🔍 a. Lọc dữ liệu theo điều kiện
var ketQua = dt.AsEnumerable()
.Where(r => r.Field<int>("Diem") > 8);
Ví dụ có AND và OR
var ketQua = dt.AsEnumerable()
.Where(r => r.Field<int>("Diem") > 8
&& r.Field<int>("ViTri") > 50 );
🔤 b. Tìm kiếm chuỗi (giống LIKE)
var ketQua = dt.AsEnumerable()
.Where(r => r.Field<string>("TenSanPham").Contains("áo"));
📅 c. Lọc theo ngày tháng
var ketQua = dt.AsEnumerable()
.Where(r => r.Field<DateTime>("NgayNhap") >= new DateTime(2024, 1, 1));
🔢 d. Sắp xếp dữ liệu
var ketQua = dt.AsEnumerable()
.OrderByDescending(r => r.Field<decimal>("Gia"));
📊 e. Tính tổng, trung bình, min, max
decimal tongGia = dt.AsEnumerable().Sum(r => r.Field<decimal>("Gia"));
decimal trungBinh = dt.AsEnumerable().Average(r => r.Field<decimal>("Gia"));
🧮 f. Đếm số dòng thỏa điều kiện
int soLuong = dt.AsEnumerable().Count(r => r.Field<string>("Loai") == "Áo");
📋 g. Chọn một số cột (projection)
var ketQua = dt.AsEnumerable()
.Select(r => new {
Ten = r.Field<string>("TenSanPham"),
Gia = r.Field<decimal>("Gia")
});
foreach (var sp in ketQua)
{
Console.WriteLine($"{sp.Ten} - {sp.Gia}");
}
👥 h. Nhóm dữ liệu (Group By)
var nhom = dt.AsEnumerable()
.GroupBy(r => r.Field<string>("LoaiSanPham"));
foreach (var group in nhom)
{
Console.WriteLine("Loại: " + group.Key);
foreach (var item in group)
{
Console.WriteLine(" - " + item.Field<string>("TenSanPham"));
}
}
✅ i. Chuyển kết quả về DataTable
var ketQua = dt.AsEnumerable()
.Where(r => r.Field<decimal>("Gia") > 100000);
if (ketQua.Any())
dataGridView1.DataSource = ketQua.CopyToDataTable();
else
MessageBox.Show("Không có kết quả");
Ví dụ DataTable trong C#, nhiều ví dụ hay về kiểu biến DataTable trong C#