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


猜你喜欢
- Android PopWindow 设置背景亮度的实例设置背景 /** * 设置添加屏幕的背景透明度 * @param bgAl
- Spring Framework 提供了一套可以方便地对 Controller 层中接收的参数进行校验的框架,其中就包括了 @Validat
- MyBatis框架提供了二级缓存接口,我们只需要实现它再开启配置就可以使用了。特别注意,我们要解决缓存穿透、缓存穿透和缓存雪崩的问题,同时也
- mybatis 查询返回Map<String,Object> 类型,平时没太注意怎么用,今天又遇到了总结记录一下,方便以后处理此
- 本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态。并能够直观的展现出来涉及到的知识点:Performanc
- 验证码及它的作用验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是
- 消息的保存路径消息发送端发送消息到 broker 上以后,消息是如何持久化的?数据分片kafka 使用日志文件的方式来保存生产者和发送者的消
- 最近在做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS_BAR设置全屏后怎么也去不掉,查找资料后,发现一个比
- Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较
- OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截
- 最终效果项目地址https://github.com/Tecode/flutter_widget实现方法安装插件安装video_player
- jdk1.8中的for循环jdk1.8 从语法角度,感觉发生的变化还是蛮大的。在此记录一下。for 循环 public stati
- 流,就是一系列的数据。当不同介质之间有数据交互的时候,JAVA就使用流来实现。数据源可以是文件,还可以是数据库、网络甚至其他的程序。比如读取
- 作者:sparkdev出处:http://www.cnblogs.com/sparkdev/注意,本文所说的断点续传特指 HTTP 协议中的
- 本文实例讲述了Android编程之Sdcard相关代码。分享给大家供大家参考,具体如下:1. 检测Sdcard是否可用:public sta
- Android 应用冷启动时,需要从Application开始启动,加载时间就会比较长,这段时间里,用户所能看到的就是”白屏“(这是因为默认
- 我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方
- 使用Post添加数据到数据库出现方块乱码解决方法,在web.xml里最前面添加过滤器,代码如下,放在最前面,因为有优先级,要首先拦截<
- 最近小明的bug有点多,忙的连王者荣耀都顾不上玩了,导致现在不得不抽点时间研究一下作为当前大多Java程序员开发工具的IDEA DEBUG功
- 目录1.问题引出2.解决办法3.另外一种自定义序列化机制(介绍Externalizable)1.问题引出在某些情况下,我们可能不想对于一个对