相关知识:

  1. DataSet和DataAdapter的内部结构:

    •   
    • DataSet通过DataAdapter从数据库中获取数据
    • DataSet对象内部包括一个集合(Tables),也就是可以拥有多个表(DataTables);每个表存放着从数据库放回的一个结果集(一般由一条SELECT语句产生一个结果集)
    • DataTable对象包含一个行集合(Rows),集合中的每个元素都是一个DataRow类型的对象。DataRow提供了通过下标或者列名进行访问字段数据的操作
    • DataTable对象还包含一个列集合(Columns),集合中的每个元素都是一个DataColumn类型的对象,用于代表查询结果集合中每一列的属性,例如名称、数据类型等
    • DataSet对象包含一个关联集合(Relations),集合中的每一个DataRelation代表两个表之间的关联。请注意,数据库表之间的关联不会被自动带到DataSet中来,需要变成为DataSet中的SataTable建立关联
    • 可以由DataTable创建(DataView),DataView可以用来代表DataTable中经过过滤后的数据,并且将用来绑定到数据展现控件中
  2. 连接的打开和关闭
    • 与SqlDataReader不用,使用DataAdapter对象,把数据加载到DataSet中,并不需要显式打开和关闭连接
    • 当调用DataAdapter的Fill函数时,该函数内部首先检查连接对象是否已经打开
      • 如果没有打开,则打开链接,填充数据,然后关闭连接
      • 如果已经打开,则直接填充数据,之后也不关闭连接
    • 一旦数据已经填充到DataSet中,就不必与数据库继续保持连接。事实上,DataSet中的数据全在内存中,与数据库无关。

代码示例:

(示例数据库使用红皮书的示例数据库:AdventureWorks_WroxSSRS2012)

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient; namespace ConsoleApplication10
{
class Program
{
static void Main(string[] args)
{
string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";
SqlConnection conn = new SqlConnection(strConn); DataSet ds = new DataSet(); string strCmd1 = "SELECT ProductCategoryID,Name FROM Production.ProductCategory";
SqlDataAdapter da1 = new SqlDataAdapter(strCmd1, conn);
// 将第一个查询结果集合填入DataSet中,并且将DataTable命名为"Category"
da1.Fill(ds, "Category"); string strCmd2 = "SELECT ProductSubcategoryID,ProductCategoryID,Name From Production.ProductSubcategory";
SqlDataAdapter da2 = new SqlDataAdapter(strCmd2, conn);
// 将第二个查询结果集合填入DataSet中,并且将DataTable命名为"Subategory"
da2.Fill(ds, "Subcategory"); // 使用视图
// 打印表中的数据
Console.WriteLine("主类别表:");
DataTable dt1 = ds.Tables["Category"];//获得Category表
DataView dv1 = new DataView(dt1); //创建视图
dv1.Sort = "ProductCategoryID ASC"; //设置排序规则
foreach (DataRowView drv in dv1)
{
Console.WriteLine("{0}:{1}", drv[], drv["Name"]);
} Console.WriteLine(""); Console.WriteLine("过滤后的子类别表:");
DataTable dt2 = ds.Tables["Subcategory"];
DataView dv2 = new DataView(dt2);
dv2.RowFilter = "ProductSubcategoryID>10";//设置过滤条件
dv2.Sort = "ProductSubcategoryID ASC";
foreach (DataRowView drv in dv2)
{
Console.WriteLine("{0}:{1}", drv[], drv["Name"]);
} Console.WriteLine(""); // 在两个表之间建立关联
DataRelation relation = new DataRelation("ProductCategory_ProductSubcategory",
dt1.Columns["ProductCategoryID"], dt2.Columns["ProductCategoryID"]);
ds.Relations.Add(relation);//将关联添加到DataSet的集合中
try
{
for (int i = ; i < dt1.Rows.Count; i++)
{
DataRow dri = dt1.Rows[i];
//根据关联找到数据相关的子类别数据
DataRow[] subRows = dri.GetChildRows(relation);
Console.WriteLine("{0}的子类别信息:", dri["Name"]);
foreach (DataRow dr in subRows)
{
Console.WriteLine("{0}:{1}", dr[], dr["Name"]);
}
Console.WriteLine("");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}

ADO.NET笔记——使用DataSet返回数据的更多相关文章

  1. Spring MVC 学习笔记11 —— 后端返回json格式数据

    Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...

  2. WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据

    数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...

  3. ADO.NET笔记——基本概念

    ADO.NET中的主要对象: Connection:连接对象.用于建立从应用程序到数据库服务器指定数据库的连接通道 Command:命令对象.用于执行增删查改等数据库语句命令 DataReader:数 ...

  4. Ado.Net,关于DataSet和DataTable

    DataSet和DataTable的 区别与联系 1.简要说明二者关系 在我们编写代码的时候从数据库里取出数据,填充到dataset里,再根据表的名字,实例化到 DataTable 中. ●注意如下  ...

  5. 浅谈WebService返回数据效率对比

    原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html 一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问 ...

  6. 【Android】Intent的使用-返回数据给上一个活动

    第一个Activity  A启动另外一个Activity B,B返回数据给A ============================================================= ...

  7. JQuery请求WebService返回数据的几种处理方式

    打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理 ...

  8. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  9. wcf传输Dataset大数据量 -压缩(一)

    wcf传输Dataset大数据量 -压缩(一) 由于WCF不能传输DataTable(不能序列化),所以更多项目中都会使用DataSet作为查询集合的首选返回类型,但是由于DataSet会生成很多的状 ...

随机推荐

  1. kmp算法简明教程

    在字符串s中寻找模式串p的位置,这是一个字符串匹配问题. 举例说明: i = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 s = a b a a c a b a a a b a a ...

  2. 解析 iOS 动画原理与实现

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到 ...

  3. 【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)

        Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高.     一个相对完善的自定义控件在布局文件中和java ...

  4. AutoCAD使用技巧

    1, 画指定长度的直线 水平线:拾取起点,然后输入@5,0或者@-5,0 垂直线:拾取起点,然后输入@0,5或者@0,-5如果你所要画的线是斜线,可以先画一条水平线,然后点击它,对它进行夹点编辑,使它 ...

  5. spring--mybatis事务总结

    spring--事务原理.mybatis--MapperScannerConfigurer 和 mybatis--MapperProxy事务,最近想把spring mybatis中的事务和mapper ...

  6. [转]WPF 获取程序启动路径

    本文转自:http://hi.baidu.com/lilipangtou/item/f1b7488e3c92c4d05e0ec1ab 在Windows Form程序中,获取自身的启动目录是非常容易的, ...

  7. jQuery图片提示和文字提示

    图片提示: 效果如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  8. hdu-5698 瞬间移动(数论+快速幂)

    题目链接: 瞬间移动 Problem Description   有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝 ...

  9. BootStraps 布局

    <div class="container"> //创建一个容器 <div class="row">  //创建行,每行总有12个格数 ...

  10. 设置input(radio,checkbox)和lable对齐的问题

    在做页面的时候几次遇到label和前面的小图标无法对齐的情况,后来发现解决方法不过是 label { display:inline-block; vertical-align:top; line-he ...