目录
一、DataTable概述
1.创建 DataTable
2.添加行
3.修改行
4.删除行
5.查询行
6.排序行
7.合并 DataTable
8.克隆 DataTable
9.复制 DataTable
10.使用 DataView 过滤和排序
11.使用 DataTable 的事件
12.使用 DataTable 的约束
13.使用 DataTable 的表达式列
14.使用 DataTable 的 XML 序列化
15.使用 DataTable 的 JSON 序列化
二、总结
一、DataTable概述
C# 中的 DataTable 是一个非常重要的类,用于在内存中存储和操作数据。它类似于数据库中的表,具有行和列的结构。下面是一个详细的教程,涵盖了 DataTable 的常见操作方法,并提供了相应的示例代码。
1.创建 DataTable
首先,我们需要创建一个 DataTable 对象,并为其添加列。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable");
table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
foreach (DataColumn column in table.Columns) { Console.WriteLine(column.ColumnName + " - " + column.DataType); } }}
2.添加行
我们可以使用 NewRow() 方法创建新行,并将其添加到 DataTable 中。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
foreach (DataRow row in table.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
3.修改行
我们可以通过索引或条件查找行,并修改其数据。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
DataRow rowToUpdate = table.Rows[0]; rowToUpdate["Name"] = "Alice Smith"; rowToUpdate["Age"] = 26;
foreach (DataRow row in table.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
4.删除行
我们可以通过 Remove() 或 Delete() 方法删除行。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
table.Rows[0].Delete(); table.AcceptChanges();
foreach (DataRow row in table.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
5.查询行
我们可以使用 Select() 方法查询符合条件的行。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
DataRow[] rows = table.Select("Age > 26");
foreach (DataRow row in rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
6.排序行
我们可以使用 DefaultView.Sort 属性对行进行排序。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
table.DefaultView.Sort = "Age DESC";
foreach (DataRowView rowView in table.DefaultView) { DataRow row = rowView.Row; Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
7.合并 DataTable
我们可以使用 Merge() 方法合并两个 DataTable。
using System;using System.Data;
class Program{ static void Main() { DataTable table1 = new DataTable("MyTable"); table1.Columns.Add("ID", typeof(int)); table1.Columns.Add("Name", typeof(string)); table1.Columns.Add("Age", typeof(int));
DataRow row1 = table1.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table1.Rows.Add(row1);
DataTable table2 = new DataTable("MyTable"); table2.Columns.Add("ID", typeof(int)); table2.Columns.Add("Name", typeof(string)); table2.Columns.Add("Age", typeof(int));
DataRow row2 = table2.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table2.Rows.Add(row2);
table1.Merge(table2);
foreach (DataRow row in table1.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
8.克隆 DataTable
我们可以使用 Clone() 方法克隆 DataTable 的结构。
using System;using System.Data;
class Program{ static void Main() { DataTable table1 = new DataTable("MyTable"); table1.Columns.Add("ID", typeof(int)); table1.Columns.Add("Name", typeof(string)); table1.Columns.Add("Age", typeof(int));
DataRow row1 = table1.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table1.Rows.Add(row1);
DataTable table2 = table1.Clone();
foreach (DataColumn column in table2.Columns) { Console.WriteLine(column.ColumnName + " - " + column.DataType); } }}
9.复制 DataTable
我们可以使用 Copy() 方法复制 DataTable 的结构和数据。
using System;using System.Data;
class Program{ static void Main() { DataTable table1 = new DataTable("MyTable"); table1.Columns.Add("ID", typeof(int)); table1.Columns.Add("Name", typeof(string)); table1.Columns.Add("Age", typeof(int));
DataRow row1 = table1.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table1.Rows.Add(row1);
DataTable table2 = table1.Copy();
foreach (DataRow row in table2.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
10.使用 DataView 过滤和排序
DataView 是 DataTable 的一个视图,可以用于过滤和排序数据。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2);
DataView view = new DataView(table); view.RowFilter = "Age > 26"; view.Sort = "Name DESC";
foreach (DataRowView rowView in view) { DataRow row = rowView.Row; Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
11.使用 DataTable 的事件
DataTable 提供了多个事件,如 RowChanged, RowChanging, RowDeleted, RowDeleting 等,可以在数据发生变化时触发。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
table.RowChanged += new DataRowChangeEventHandler(RowChangedEvent);
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1); }
private static void RowChangedEvent(object sender, DataRowChangeEventArgs e) { Console.WriteLine($"Row changed: {e.Action}, {e.Row["Name"]}"); }}
12.使用 DataTable 的约束
我们可以为 DataTable 添加约束,如主键约束、唯一约束等。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
table.PrimaryKey = new DataColumn[] { table.Columns["ID"] };
table.Columns["Name"].Unique = true;
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
try { DataRow row2 = table.NewRow(); row2["ID"] = 1; row2["Name"] = "Bob"; row2["Age"] = 30; table.Rows.Add(row2); } catch (Exception ex) { Console.WriteLine(ex.Message); } }}
13.使用 DataTable 的表达式列
我们可以使用表达式列来计算列的值。
using System;using System.Data;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
table.Columns.Add("IsAdult", typeof(bool), "Age >= 18");
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
DataRow row2 = table.NewRow(); row2["ID"] = 2; row2["Name"] = "Bob"; row2["Age"] = 16; table.Rows.Add(row2);
foreach (DataRow row in table.Rows) { Console.WriteLine($"{row["Name"]} is adult: {row["IsAdult"]}"); } }}
14.使用 DataTable 的 XML 序列化
我们可以将 DataTable 序列化为 XML,或者从 XML 反序列化为 DataTable。
using System;using System.Data;using System.IO;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
string xml = table.GetXml(); Console.WriteLine(xml);
File.WriteAllText("table.xml", xml);
DataTable newTable = new DataTable(); newTable.ReadXml("table.xml");
foreach (DataRow row in newTable.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
15.使用 DataTable 的 JSON 序列化
我们可以使用 JsonConvert 类将 DataTable 序列化为 JSON,或者从 JSON 反序列化为 DataTable。
using System;using System.Data;using Newtonsoft.Json;
class Program{ static void Main() { DataTable table = new DataTable("MyTable"); table.Columns.Add("ID", typeof(int)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Age", typeof(int));
DataRow row1 = table.NewRow(); row1["ID"] = 1; row1["Name"] = "Alice"; row1["Age"] = 25; table.Rows.Add(row1);
string json = JsonConvert.SerializeObject(table); Console.WriteLine(json);
DataTable newTable = JsonConvert.DeserializeObject<DataTable>(json);
foreach (DataRow row in newTable.Rows) { Console.WriteLine($"{row["ID"]}, {row["Name"]}, {row["Age"]}"); } }}
二、总结
DataTable 是 C# 中非常强大的数据结构,适用于处理内存中的数据。通过本教程,我们应该已经掌握了 DataTable 的基本操作,包括创建、添加、修改、删除、查询、排序、合并、克隆、复制、使用 DataView、事件处理、约束、表达式列、XML 和 JSON 序列化等操作。
阅读原文:原文链接
该文章在 2025/10/18 11:19:15 编辑过