ADO.NET快速入门——使用DataSet返回数据

相关知识:

  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)

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Data;
 7 using System.Data.SqlClient;
 8
 9 namespace ConsoleApplication10
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             string strConn = @"server=Joe-PC;database=AdventureWorks_WroxSSRS2012;uid=sa;pwd=root";
16             SqlConnection conn = new SqlConnection(strConn);
17
18             DataSet ds = new DataSet();
19
20             string strCmd1 = "SELECT ProductCategoryID,Name FROM Production.ProductCategory";
21             SqlDataAdapter da1 = new SqlDataAdapter(strCmd1, conn);
22             // 将第一个查询结果集合填入DataSet中,并且将DataTable命名为"Category"
23             da1.Fill(ds, "Category");
24
25             string strCmd2 = "SELECT ProductSubcategoryID,ProductCategoryID,Name From Production.ProductSubcategory";
26             SqlDataAdapter da2 = new SqlDataAdapter(strCmd2, conn);
27             // 将第二个查询结果集合填入DataSet中,并且将DataTable命名为"Subategory"
28             da2.Fill(ds, "Subcategory");
29
30             // 使用视图
31             // 打印表中的数据
32             Console.WriteLine("主类别表:");
33             DataTable dt1 = ds.Tables["Category"];//获得Category表
34             DataView dv1 = new DataView(dt1); //创建视图
35             dv1.Sort = "ProductCategoryID ASC"; //设置排序规则
36             foreach (DataRowView drv in dv1)
37             {
38                 Console.WriteLine("{0}:{1}", drv[0], drv["Name"]);
39             }
40
41             Console.WriteLine("");
42
43             Console.WriteLine("过滤后的子类别表:");
44             DataTable dt2 = ds.Tables["Subcategory"];
45             DataView dv2 = new DataView(dt2);
46             dv2.RowFilter = "ProductSubcategoryID>10";//设置过滤条件
47             dv2.Sort = "ProductSubcategoryID ASC";
48             foreach (DataRowView drv in dv2)
49             {
50                 Console.WriteLine("{0}:{1}", drv[0], drv["Name"]);
51             }
52
53             Console.WriteLine("");
54
55             // 在两个表之间建立关联
56             DataRelation relation = new DataRelation("ProductCategory_ProductSubcategory",
57                 dt1.Columns["ProductCategoryID"], dt2.Columns["ProductCategoryID"]);
58             ds.Relations.Add(relation);//将关联添加到DataSet的集合中
59             try
60             {
61                 for (int i = 0; i < dt1.Rows.Count; i++)
62                 {
63                     DataRow dri = dt1.Rows[i];
64                     //根据关联找到数据相关的子类别数据
65                     DataRow[] subRows = dri.GetChildRows(relation);
66                     Console.WriteLine("{0}的子类别信息:", dri["Name"]);
67                     foreach (DataRow dr in subRows)
68                     {
69                         Console.WriteLine("{0}:{1}", dr[0], dr["Name"]);
70                     }
71                     Console.WriteLine("");
72                 }
73             }
74             catch (Exception e)
75             {
76                 Console.WriteLine(e);
77             }
78         }
79     }
80 }

时间: 2024-10-05 17:05:52

ADO.NET快速入门——使用DataSet返回数据的相关文章

?HealthKit开发快速入门教程之HealthKit数据的操作

HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道一天走的步数.本章将主要讲解HealthKit数据构成的方式,以及如何规范的表达一个数据. 2.1  数据的操作 在HealthKit中,数据都是与单位和值组成的,如图2.1所示.此图为一个睡眠分析的截图.在此图中59m就代表了一个数据.其中m为单位,59为基于单位的数值.本节将讲解数据的创建.判断

AngularJS快速入门指南14:数据验证

thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table.reference>thead>tr>td, table.reference>tbody>tr>td, table.reference>tfoot>tr>td { padding: 8px; line-height: 1.42857143; vertic

ADO.NET快速入门——利用Command对象的ExecuteScalar()方法返回一个数据值

相关知识: 有些SQL操作,例如SUM,只会从数据库返回一个数据值,而不是多行数据 尽管也可以使用ExecuteReader()返回一个DataReader对象,代表该数据值,但是使用Command对象的ExecuteScalar方法更加方便 ExecuteScalar()方法:该方法只能执行SELECT语句,通常用于统计,例如返回符合条件的记录个数 代码示例: 1 using System; 2 using System.Collections.Generic; 3 using System.

ADO.NET快速入门——使用Command执行增删改操作,通过判断ExecuteNonQuery()返回值检查是否操作成功

相关知识: ExecuteNonQuery()方法:执行CommandText属性所制定的操作,返回受影响的记录条数.该方法一般用来执行SQL中的UPDATE.INSERT和DELETE等操作 对于UPDATE.INSERT和DELETE语句,执行成功返回值为该命令所影响的行数,如果影响行数为0时返回值为0,如果数据操作回滚则返回值为-1.但是对于其他的操作比如对数据库结构的操作,如果操作成功时返回的确是-1,例如给数据库添加一个数据表CREATE操作,当表创建成功返回-1,如果操作失败,则发生

ADO.NET快速入门——将DataReader作为函数返回值

相关知识: 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者.例如定义函数:SqlDataReader returnDR(),然后再Main函数中调用它. 但这里导致了一个问题:在哪里关闭数据库连接? 在returnDR()函数中关闭Connection,那么在Main函数中将无法获取每行数据: 在Main函数中关闭Connection,但是Main函数无法访问returnDR()函数内部定义的SqlConnection对象:(除非把SqlCo

ThinkPHP3快速入门教程二:数据CURD

CURD(创建[Create].更新[Updata].读取[Read].删除[Delete]),定义了用于处理数据的基本原子操作. CURD在具体的应用中并非一定使用create.updata.read.delete字样的方法,但是他们完成的功能是一致的. 例如: ThinkPHP就是使用add.save.select和delete方法表示模型的CURD操作. 一.创建数据 CURD的Create操作通常会通过表单来提交数据,首先,我们在项目的Tpl/Form目录下面创建一个add.html模板

ThinkPHP3.1快速入门(2)数据CURD

上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作. CURD CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD.它代表创建(Create).更新(Update).读取(Read)和删除(Delete)操作.CURD 定义了用于处理数据的基本原子操作.之所以将CURD 提升到一个技术难题的高度是因为完成一个涉及在多个数据库系统中进行CURD操作的汇总相关的活动

ADO.NET快速入门——SQL注入攻击

相关知识: 可以通过字符串的拼接来构造一个SQL命令字符串,但是SQL命令字符串的拼接确是造成“SQL注入攻击”的重要原因. 考虑下列例子:从ProductCategory表中检索出Name为“Bikes”的类别信息.(示例数据库采用红皮书的数据库:AdventureWorks_WroxSSRS2012) 如果要凭借字符串,将写成: string name = "Bikes"; string strCmd = "SELECT ProductCategoryID, Name F

ADO.NET快速入门——带参数的查询防止SQL注入攻击

相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设定: string strCmd = "SELECT AccountID FROM Account WHERE [email protected] AND [email protected]"; 对于SQL Server数据库,“@”是参数的前缀.上句中定义了两个参数:@Acc