C#中DataSet的用法
1. 什么是DataSet
DataSet是C#中用于存储和管理数据的一个类,可以将多个表格以及它们之间的关系存储为一个单独的对象,从而使得在应用程序中处理数据变得更加方便。
DataSet中包含多个DataTable,每个DataTable代表一个表格,DataTable中包含多个DataRow,每个DataRow代表表格中的一行数据。此外,DataSet还可以包含多个DataRelation对象,表示表格之间的关系,类似于数据库中的外键。
2. DataSet的基本用法
2.1 创建DataSet
要创建一个DataSet,我们可以使用DataSet的构造函数来创建一个空的DataSet对象,然后向其中添加DataTable以及DataRelation:
DataSet ds = new DataSet();
DataTable dt1 = new DataTable("Table1");
DataTable dt2 = new DataTable("Table2");
ds.Tables.Add(dt1);
ds.Tables.Add(dt2);
DataRelation relation = new DataRelation("Relation1", dt1.Columns["id"], dt2.Columns["table1_id"]);
ds.Relations.Add(relation);
通过上面的代码,我们创建了一个空的DataSet对象ds,并向其中添加了两个DataTable,分别命名为Table1和Table2。接着,我们创建了一个DataRelation对象表示表格之间的关系,通过指定DataRelation的第二个参数(dt1.Columns["id"])和第三个参数(dt2.Columns["table1_id"]),我们指定了两个表格之间关联的列。
2.2 向DataSet中添加数据
向DataSet中添加数据可以通过向其中的DataTable添加DataRow来实现,例如:
DataRow row1 = dt1.NewRow();
row1["id"] = 1;
row1["name"] = "张三";
dt1.Rows.Add(row1);
DataRow row2 = dt1.NewRow();
row2["id"] = 2;
row2["name"] = "李四";
dt1.Rows.Add(row2);
上面的代码先创建了两个DataRow对象,然后为它们的各个属性赋值,最后将它们添加到DataTable中。注意,我们需要在添加DataRow之前先调用DataTable的NewRow()方法创建一个空的DataRow对象,并且在为DataRow的各个属性赋值之后再将其添加到DataTable中。
2.3 从DataSet中获取数据
从DataSet中获取数据可以通过遍历其中的DataTable和DataRow来实现,例如:
foreach (DataTable table in ds.Tables)
{
Console.WriteLine(table.TableName);
foreach (DataRow row in table.Rows)
{
Console.WriteLine("\t{0}\t{1}", row["id"], row["name"]);
}
}
上面的代码先遍历DataSet中的每个DataTable,然后遍历其中的每个DataRow,并输出其id和name属性的值。
3. DataSet的高级用法
3.1 使用DataAdapter填充DataSet
使用DataAdapter可以将数据源中的数据填充到DataSet中,例如:
string connectionString = "Data Source=myServerAddress;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;";
string sql = "SELECT * FROM Table1";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
adapter.Fill(ds, "Table1");
}
上面的代码创建了一个SqlConnection对象表示数据库连接,然后创建了一个SqlDataAdapter对象表示数据适配器。通过调用DataAdapter的Fill方法可以将数据源中的数据填充到DataSet中,其中第二个参数指定填充到DataSet中的表格的名称。
3.2 使用DataSet更新数据源
在DataSet中对数据进行修改、添加或删除后,可以通过DataAdapter将这些变化保存回数据源,例如:
string connectionString = "Data Source=myServerAddress;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;";
string sql = "SELECT * FROM Table1";
using (SqlConnection connection = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(sql, connection);
DataSet ds = new DataSet();
adapter.Fill(ds, "Table1");
DataRow row = ds.Tables["Table1"].Rows[0];
row["name"] = "新的姓名";
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
adapter.Update(ds.Tables["Table1"]);
}
上面的代码先创建一个SqlDataAdapter对象,并使用其Fill方法将数据源中的数据填充到DataSet中。接着,我们修改了一个DataRow的name属性,然后创建了一个SqlCommandBuilder对象,它可以根据DataAdapter的Command属性自动创建InsertCommand、UpdateCommand和DeleteCommand,从而将DataSet中的变化保存到数据源中。
3.3 序列化和反序列化DataSet
DataSet可以通过序列化和反序列化来实现在不同应用程序之间传递数据的目的,例如:
DataSet ds = new DataSet();
// 添加表格和数据...
XmlSerializer serializer = new XmlSerializer(typeof(DataSet));
using (FileStream stream = new FileStream("data.xml", FileMode.Create))
{
serializer.Serialize(stream, ds);
}
DataSet ds2;
using (FileStream stream = new FileStream("data.xml", FileMode.Open))
{
ds2 = (DataSet)serializer.Deserialize(stream);
}
上面的代码创建了一个DataSet对象,并向其中添加表格和数据。然后,我们使用XmlSerializer类将DataSet对象序列化到文件data.xml中,以便日后反序列化。在反序列化时,我们使用相同的XmlSerializer类从文件中反序列化出DataSet对象ds2。
4. 总结
本文介绍了C#中DataSet的基本用法和高级用法,包括创建DataSet、向其中添加数据、从其中获取数据、使用DataAdapter填充DataSet、使用DataSet更新数据源以及序列化和反序列化DataSet等。
DataSet作为C#中用于存储和管理数据的一个类,有着广泛的应用场景,可以在各种类型的应用程序中使用。