C# dataset存放多张表的实例

作者:路人甲JIA 时间:2022-10-10 14:08:13 

在C#中用同一个dataset保存从数据库中取出的多张表:


cmd.CommandText = "select * from table1;";
NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); //实例化一个类,它用于连接C#与数据库,并执行cmd语句且将结果缓存到适配器中
DataSet thedataset = new DataSet(); //实例化一个dataset,实例名为thedataset(通常被定义为ds)
da.Fill(thedataset, "thetable1"); //将适配器中的内容填充到dataset的thetable1表中, thetable1同时被建立
cmd.Parameters.Clear(); //清空cmd内容,如果不清空下次使用时会抛出异常
cmd.CommandText = "select * from table2;";
da = new NpgsqlDataAdapter(cmd);
da.Fill(thedataset, "thetable2"); //将适配器中的内容填充到dataset的thetable2表中, thetable2同时被建立
cmd.Parameters.Clear(); //清空cmd内容
...
int count = thedataset.Tables["thetable1"].Rows.Count; //获取表thetable1的行数
string a = 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。


DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]);

为了使用有关系,需要从一张表的行进入另一张表的关联行,这就是对关系导航。通常导航是指从一张表的父行进入另一张表的子行。那么假如给定父表中的一行,如何获取子表中与其对应的所有行呢?我们可以使用DataRow对象的GetChildRows()方法提取这些行。示例:一个顾客(Customers)表包含有一个或多个订单(Orders)表,建立这两个表之间的数据并提取数据的代码如下。


static void Main(string[] args)
   {
     string connStr = @"Data Source=.\SQLEXPRESS; AttachDbFilename='C:\SQL Sever 2000 Sample Databases\NORTHWND.MDF';Integrated Security=True;User Instance=true";
     SqlConnection conn = new SqlConnection(connStr);
     conn.Open();
     //创建用于保存修改的数据的适配器
     SqlDataAdapter adapter = new SqlDataAdapter("select CustomerID,CompanyName from Customers", conn);
     SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
     //创建数据集
     DataSet ds = new DataSet();
     //创建读取Customers表的适配器
     SqlDataAdapter custAdapter = new SqlDataAdapter("select * from Customers", conn);
     //创建读取Orders表的适配器
     SqlDataAdapter orderAdapter = new SqlDataAdapter("select * from Orders", conn);
     //填充两个表的数据并放到DataSet中
     custAdapter.Fill(ds, "Customers");
     orderAdapter.Fill(ds, "Orders");
     //创建两个表之间的关系
     DataRelation custOrderRel = ds.Relations.Add("CustOrders", ds.Tables["Customers"].Columns["CustomerID"], ds.Tables["Orders"].Columns["CustomerID"]);
     foreach (DataRow custRow in ds.Tables["Customers"].Rows)
     {
       Console.WriteLine("Customer ID: " + custRow["CustomerID"] + "\tName: " + custRow["CompanyName"]);
       foreach (DataRow orderRow in custRow.GetChildRows(custOrderRel))
       {
         Console.WriteLine(" Order ID: "+orderRow["OrderID"]);
       }
     }
     conn.Close();

Console.ReadKey();

}

利用两个表之间的关系访问表中的数据的时候,我们还可以使用Linq over DataSet 。这需要导入System.Data.Linq命名空间。我们可以使用如下代码代替上述代码中的foreach部分:


     var preferredCustomers = from c in Customers
                  where c.GetChildRows("CustOrders").Length > 10
                  orderby c.GetChildRows("CustOrders").Length
                  select c;
     Console.WriteLine("Customers with > 10 orders:");
     foreach (var customer in preferredCustomers)
     {
       Console.WriteLine("{0} orders: {1} {2}, {3} {4}",customer.GetChildRows("CustOrders").Length,
         customer["CustomerID"],customer["CompanyName"],customer["City"],customer["Region"]);
     }

表之间的关系除了两个表之间的关系,还有更复杂的多表连接。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/u013719339/article/details/79251613

标签:C#,dataset
0
投稿

猜你喜欢

  • 解决mybatis一对多查询resultMap只返回了一条记录问题

    2022-07-08 08:36:31
  • C#算法函数:获取一个字符串中的最大长度的数字

    2022-12-25 10:20:04
  • Flutter Dio二次封装的实现

    2022-08-27 08:56:05
  • 基于C# winform实现图片上传功能的方法

    2022-09-12 18:18:14
  • 使用fastjson中的JSONPath处理json数据的方法

    2021-12-14 09:09:58
  • 解析C#设计模式之单例模式

    2021-12-15 17:41:12
  • 解决Java提示正在尝试分配更低的访问权限问题

    2023-11-04 09:31:08
  • 详解使用IntelliJ IDEA新建Java Web后端resfulAPI模板

    2023-12-14 09:26:04
  • c# xml转word的实现示例

    2023-01-05 15:47:59
  • java开发_图片截取工具实现原理

    2023-10-23 22:52:06
  • 超全MyBatis动态代理详解(绝对干货)

    2023-11-14 02:28:19
  • 详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

    2022-10-26 21:27:59
  • Spring MVC返回的json去除根节点名称的方法

    2023-07-15 17:46:55
  • Java多线程的具体介绍与使用笔记小结

    2023-01-17 05:23:13
  • C#自定义签名章实现方法

    2022-08-02 05:22:37
  • Android利用RecyclerView实现列表倒计时效果

    2023-09-04 05:29:27
  • Java中List Set和Map之间的区别_动力节点Java学院整理

    2022-12-11 04:57:38
  • java高并发InterruptedException异常引发思考

    2022-09-09 20:15:34
  • 关于MVC与SpringMVC的介绍、区别、执行流程

    2023-11-28 02:25:56
  • 使用FeignClient设置动态Url

    2022-07-04 05:55:39
  • asp之家 软件编程 m.aspxhome.com