C# dataset存放多张表的实例
在C#中用同一个dataset保存从数据库中取出的多张表:
cmd.CommandText="select*fromtable1;"; NpgsqlDataAdapterda=newNpgsqlDataAdapter(cmd);//实例化一个类,它用于连接C#与数据库,并执行cmd语句且将结果缓存到适配器中 DataSetthedataset=newDataSet();//实例化一个dataset,实例名为thedataset(通常被定义为ds) da.Fill(thedataset,"thetable1");//将适配器中的内容填充到dataset的thetable1表中,thetable1同时被建立 cmd.Parameters.Clear();//清空cmd内容,如果不清空下次使用时会抛出异常 cmd.CommandText="select*fromtable2;"; da=newNpgsqlDataAdapter(cmd); da.Fill(thedataset,"thetable2");//将适配器中的内容填充到dataset的thetable2表中,thetable2同时被建立 cmd.Parameters.Clear();//清空cmd内容 ... intcount=thedataset.Tables["thetable1"].Rows.Count;//获取表thetable1的行数 stringa=thedataset.Tables["thetable2"].Rows[1][0].ToString().;//获取表thetable2第2行第1列的值
补充:在DataSet中访问多个表
ADO.Net模型有一个很大的优点,就是DataSet对象可以跟踪多个表和它们之间的关系。这表示可以在一个操作的不同程序段之间传递完整的相关数据集,体系结构内在地维护数据之间关系的完整性。
ADO.Net中的DataRelation对象用于描述DataSet中的多个DataTables对象之间的关系。每个DataSet都包含DataRelations的Relations集合,以查找和操纵相关表。DataSet的Relations属性是一个DataRelation对象的集合,DataRelation对象表示这个DataSet之间表之间的关系。要创建一个新的DataRelation,可以使用Relations的Add()方法,该方法接收表示关系的字符串名和两个DataColumn(父列后跟子列)。比如:要创建Customers表的CustomerID列和Orders表的CustomerID列之间的关系,应使用下面的语法,把它们的关系命名为CustOrders。
DataRelationcustOrderRel=ds.Relations.Add("CustOrders",ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]);
为了使用有关系,需要从一张表的行进入另一张表的关联行,这就是对关系导航。通常导航是指从一张表的父行进入另一张表的子行。那么假如给定父表中的一行,如何获取子表中与其对应的所有行呢?我们可以使用DataRow对象的GetChildRows()方法提取这些行。示例:一个顾客(Customers)表包含有一个或多个订单(Orders)表,建立这两个表之间的数据并提取数据的代码如下。
staticvoidMain(string[]args) { stringconnStr=@"DataSource=.\SQLEXPRESS;AttachDbFilename='C:\SQLSever2000SampleDatabases\NORTHWND.MDF';IntegratedSecurity=True;UserInstance=true"; SqlConnectionconn=newSqlConnection(connStr); conn.Open(); //创建用于保存修改的数据的适配器 SqlDataAdapteradapter=newSqlDataAdapter("selectCustomerID,CompanyNamefromCustomers",conn); SqlCommandBuilderbuilder=newSqlCommandBuilder(adapter); //创建数据集 DataSetds=newDataSet(); //创建读取Customers表的适配器 SqlDataAdaptercustAdapter=newSqlDataAdapter("select*fromCustomers",conn); //创建读取Orders表的适配器 SqlDataAdapterorderAdapter=newSqlDataAdapter("select*fromOrders",conn); //填充两个表的数据并放到DataSet中 custAdapter.Fill(ds,"Customers"); orderAdapter.Fill(ds,"Orders"); //创建两个表之间的关系 DataRelationcustOrderRel=ds.Relations.Add("CustOrders",ds.Tables["Customers"].Columns["CustomerID"],ds.Tables["Orders"].Columns["CustomerID"]); foreach(DataRowcustRowinds.Tables["Customers"].Rows) { Console.WriteLine("CustomerID:"+custRow["CustomerID"]+"\tName:"+custRow["CompanyName"]); foreach(DataRoworderRowincustRow.GetChildRows(custOrderRel)) { Console.WriteLine("OrderID:"+orderRow["OrderID"]); } } conn.Close(); Console.ReadKey(); }
利用两个表之间的关系访问表中的数据的时候,我们还可以使用LinqoverDataSet。这需要导入System.Data.Linq命名空间。我们可以使用如下代码代替上述代码中的foreach部分:
varpreferredCustomers=fromcinCustomers wherec.GetChildRows("CustOrders").Length>10 orderbyc.GetChildRows("CustOrders").Length selectc; Console.WriteLine("Customerswith>10orders:"); foreach(varcustomerinpreferredCustomers) { Console.WriteLine("{0}orders:{1}{2},{3}{4}",customer.GetChildRows("CustOrders").Length, customer["CustomerID"],customer["CompanyName"],customer["City"],customer["Region"]); }
表之间的关系除了两个表之间的关系,还有更复杂的多表连接。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。