C# dataset存放多张表的实例

 更新时间:2021年01月19日 10:46:10   作者:路人甲JIA  
这篇文章主要介绍了C# dataset存放多张表的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在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"]);
      }

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

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

相关文章

  • C#实现移动窗体的两种共方法

    C#实现移动窗体的两种共方法

    在C#Form窗体设计中,如果我们不需要使用默认边框设计自己个性化的窗体,这时候你会发现拖动窗体的功能就没有了,这里需要自己构建方法让用户可以拖动整个窗体,下面就介绍两种方法来实现,需要的朋友可以参考下
    2024-09-09
  • C#中把DataTable、Dataset转Json数据

    C#中把DataTable、Dataset转Json数据

    这篇文章介绍了C#中把DataTable、Dataset转Json数据的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#的编码规范详细说明

    C#的编码规范详细说明

    编码规范是老生常谈的问题,现在再看代码规范可能不会再去在意变量,控件的命名方法等,而是更加关注代码的实用性
    2013-08-08
  • C#制作简易的屏保

    C#制作简易的屏保

    这篇文章主要为大家详细介绍了C#制作简易的屏保的相关资料,C#如何制作屏保的过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • unity3D实现摄像机抖动特效

    unity3D实现摄像机抖动特效

    这篇文章主要为大家详细介绍了unity3D实现摄像机抖动特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#如何实现调取钉钉考勤接口的功能

    C#如何实现调取钉钉考勤接口的功能

    这篇文章主要介绍了C#如何实现调取钉钉考勤接口的功能,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • C#使用System.Net.Mail类实现邮件发送

    C#使用System.Net.Mail类实现邮件发送

    这篇文章介绍了C#使用System.Net.Mail类实现邮件发送的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#实现扑克游戏(21点)的示例代码

    C#实现扑克游戏(21点)的示例代码

    21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。本文将用C#实现这一经典游戏,需要的可以参考一下
    2022-08-08
  • C#实现拆分合并Word表格中的单元格

    C#实现拆分合并Word表格中的单元格

    我们在使用Word制作表格时,由于表格较为复杂,只是简单的插入行、列并不能满足我们的需要。要做一个完整的表格,很多时候需要将单元格进行拆分或者合并。本文将详细为您介绍在Word表格中拆分或合并单元格的思路及方法,希望对大家有所帮助
    2022-12-12
  • C#简单读写txt文件的方法

    C#简单读写txt文件的方法

    这篇文章主要介绍了C#简单读写txt文件的方法,涉及C#针对文件的基本打开、写入、保存与读取等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06

最新评论