C#使用SqlDataAdapter对象获取数据的方法

本文实例讲述了C#使用SqlDataAdapter对象获取数据的方法。分享给大家供大家参考,具体如下:

一.SqlDataAdapter对象

1. SqlDataAdapter特性

SqlDataAdapter类用作ADO.NET对象模型中和数据连接部分和未连接部分之间的桥梁。SqlDataAdapter从数据库中获取数据,并将其存储在DataSet中。SqlDataAdapter也可能取得DataSet中的更新,并将它们提交给数据库。

SqlDataAdapter是为处理脱机数据而设计的,调用其Fill方法填充DataSet时甚至不需要与数据库的活动连接。即如果调用Fill方法时,SqlDataAdapter与数据库的连接不是打开时,SqlDataAdapter将打开数据库连接,查询数据库,提取查询结果,将查询结果填入DataSet,然后关闭也数据库的连接。

2. SqlDataAdapter的设置

SqlCommand属性

SqlDataAdapter将查询结果存储到DataSet中时,SqlDataAdapter使用SqlCommand和SqlConnection与数据库进行通信。SqlDataAdapter在内部使用SqlDataReader获取结果,并将信息存储到DataSet的新行。SqlCommand类的属性包括SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别对应数据库的查询、插入、更新和删除操作。

TabbleMappings集合

默认情况下,SqlDataAdapter假定SqlDataReader中的列与DataSet中的列匹配,但实际情况中往往期望DataSet的架构不同于数据库的架构,因此SqlDataAdapter提供了一种将查询结果映射到DataSet结果的机制:TableMappings集合。

SqlDataAdapter的TableMappings属性返回一个DataTableMappingsConnention对象,它包含DataTableMapping对象的集合。每个对象允许在数据库中的一个表(或视图或存储过程)与DataSet中相对应的DataTable的名称之间建立一种映射;TableMappings对象具有ColumnMappings属性,它返回DataColumnMappings对象组成的集合,每个DataColumnMappings对象对应数据库查询结果中的一列映射到DataSet中DataTable中的一列。示例代码如下:

Using System.Data.Common;
SqlDataAdapter da=new SqlDataAdapter();
//初始化DataAdapter
DataTableMapping tableMap;
tableMap=da.TableMappings.Add("Table","Employees");
tableMap.ColumnMappings.Add("EmpID","EmployeeID");
tableMap.ColumnMappings.Add("LName","LastName");

二.SqlDataAdapter的创建与使用

1. 创建SqlDataAdapter

New 关键字

New 关键字建立新的SqlDataAdapter对象后,再设置其SqlCommand属性

SqlDataAdapter da=new SqlDataAdapter();
da.SelectCommand=cmd;

SqlDataAdapter的构造函数

strSql是查询数符串;strConn是数据库连接字符串;cmd是SqlCommand对象;cn是SqlConnection对象。

SqlDataAdapter da=new SqlDataAdapter(strSql,strConn);
SqlDataAdapter da=new SqlDataAdapter(strSql,cn);
SqlDataAdapter da=new SqlDataAdapter(cmd);

2. 获取查询中的结果

使用Fill方法

调用SqlDataAdapter类的Fill方法会执行存储在SqlDataAdapter对象的SqlCommand属性中的查询,并将查询结果存储在DataSet中。示例代码如下:

SqlDataAdapter da=new SqlDataAdapter(strSql,strConn);
DataSet ds =new DataSet();
da.Fill(ds);

执行以上代码后,DataSet的实例对象ds中会创建一个新的DataTable,这个DataTable拥有strSql查询语句中所包括的字段,但DataTable对象的名称为默认的Table,而不是查询语句中所查询的表的名称。

使用重载的Fill方法

指定DataTable

da.Fill(DataSet,"MyTableName")
// SqlDataAdapter填充指定DataSet的特定表。
da.Fill(DataTable);
// SqlDataAdapter填充已经创建的DataTable对象。

Fill方法分页显示

da.Fill(DataSet,intStartRecord,intNumRecord,"TableName");
//Fill方法可能很轻松的实现分页显示,但操作效率很低。

调用SqlDataAdapter对象Fill方法过程的数据库连接的打开与关闭

SqlDataAdapter的Fill方法调用前不需要有活动的SqlConnection对象,SqlDataAdapter会自己打开strConn语句中的数据库,获取查询结果后,关闭与数据库的连接。如果已经存在SqlConnection对象,无论是否已经打开,SqlDataAdapter执行完Fill方法后,均会将SqlConnection对象返回到原始状态。

当程序中的多个SqlDataAdapter对象使用都一个SqlConnection对象时,为避免多次打开与关闭SqlConnection对象,应该在调用SqlDataAdapter的Fill方法前调用SqlConnection的Open方法打开数据库的连接,待完成Fill调用后再调用SqlConnection的Close方法关闭数据库的连接。

DataSet中数据的更新

如果DataSet中的数据需要更新,在调用Fill方法之前应该先清除DataSet或DataTable中的数据,这样可以确保DataTable中不会出现重复的数据行,也不会出现数据库中已经不存在的数据行。

3. 将查询结果映射到DataSet

TableMappings映射

TabbleMappings集合控制SqlDataAdapter如何将DataSet映射到数据库。如果保持TabbleMappings集合为空,调用Fill方法,然后将DataSet作为参数,而不指定表名,SqlDataAdapter将假定您希望使用一个名为"Table"的DataTable来装载数据。

SqlDataAdapter.TableMappings.Add("Table","Employees")

此语句的作用是将DataSet中原来名字为"Table"的DataTable命名为"Employees",DataSet填充数据时,按查询结果集的顺序依次填充DataSet中的Table、Table1、Table2……,所以给DataTable命名时需留意该DataTable是否为当前将要使用的对象。

TableMappings和ColumnMappings的AddRange方法

构造并赋值DataTableMapping、DataColumnMapping数组,再调用它们的AddRange方法将该集合整体添加到映射数组。

DataTableMapping tableMap;
tableMap=da.TableMapping.Add("Table","Employees");
DataColumnMapping[] columnMaps;
columnMaps=new DataColumnMapping[];
{new DataColumnMapping ("EmpID","EmployeeID"),
new DataColumnMapping ("LName","LastName")
}
tableMap.ColumnMapping.AddRange(columnMaps);

MissingMappingAction属性

当SqlDataAdapter提取查询结果来填充DataSet时,它将检查TableMappings集合,如果存在结果集中列不在TableMappings集合时,它将查看MissingMappingAction属性的值来决定如何操作。

Passthrough 映射中没有出现的列仍然填充到DataSet,采用原结果集的名称;

Ignore  忽略映射中没有出现的列;

Error 在出现不匹配的情况下引发异常;

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#面向对象程序设计入门教程》、《WinForm控件用法总结》及《C#常见控件用法教程》

希望本文所述对大家C#程序设计有所帮助。

(0)

相关推荐

  • C#中Cookie之存储对象

    本文通过代码详细给大家做讲解,具体内容如下: 做项目过程中,用户登陆之后,需要将用户的信息存到Cookie中,但因为Cookie中只能存储字符串,所以想到了先把用户实体序列化成Json串,存储在Cookie中,用到的时候再拿出来反序列化. 道理很简单,网上的例子也很多,但还是遇到一些小困难.下面与大家分享成果.(我的开发环境为VS2012,.net framework版本为4.0,) C#中Json与对象之间的互相转换 下载并引用Newtonsoft.Json.dll 定义一个简单的用户实体:

  • C# 对象持久化详解

    对象持久化是指将内存中的对象保存到可永久保存的存储设备中(如磁盘)的一种技术. 本文介绍的是除数据库之外的几种对象持久化方式. 具体如下: 保存成文本:即将内存对象以字节流的方式保存到文本中. 序列化成Xml:即将对象以Xml的格式存储. 序列化成Json:即将对象序列化成Json对象,然后存储. 序列化成二进制:即将对象序列化成二进制字节流保存到文件中. 涉及知识点: 序列化与反序列化 文件流的读写 ListView显示复选框,并横向排列 如下图所示[主要功能是将用户输入的信息保存成各种格式,

  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    使用对象初始值设定项初始化对象 可以使用对象初始值设定项以声明方式初始化类型对象,而无需显式调用类型的构造函数. 下面的示例演示如何将对象初始值设定项用于命名对象.编译器通过先访问默认实例构造函数然后处理成员初始化处理对象初始值设定项.因此,如果默认构造函数在类中声明为 private,那么需要公共访问权的对象初始值设定项将失败. 下面的示例演示如何使用对象初始值设定项初始化新的 StudentName 类型. public class Program { public static void

  • C#实现获取不同对象中名称相同属性的方法

    本文实例讲述了C#实现获取不同对象中名称相同属性的方法.分享给大家供大家参考.具体如下: [两个类] class demo1 { public string Name { get; set; } public int Age { get; set; } } class demo2 { public string Name { get; set; } public string Address { get; set; } } [初始化数据] List<object> list = new Lis

  • C#中使用反射遍历一个对象属性及值的小技巧

    总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): 复制代码 代码如下: Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi in t.GetProperties()) {     object value1 = pi.GetValue(tc, null));//用pi.GetVal

  • C#查找对象在ArrayList中出现位置的方法

    本文实例讲述了C#查找对象在ArrayList中出现位置的方法.分享给大家供大家参考.具体分析如下: 我们可以通过IndexOf方法来查找对象在ArrayList中的位置 ArrayList alcollect = new ArrayList(); // Add individual items to the collection string str = "learn csharp"; alcollect.Add(str); //find position of object Con

  • C#编程中使用ref和out关键字来传递数组对象的用法

    在 C# 中,数组实际上是对象,而不只是像 C 和 C++ 中那样的可寻址连续内存区域. Array 是所有数组类型的抽象基类型. 可以使用 Array 具有的属性以及其他类成员. 这种用法的一个示例是使用 Length 属性来获取数组的长度. 下面的代码将 numbers 数组的长度(为 5)赋给名为 lengthOfNumbers 的变量: int[] numbers = { 1, 2, 3, 4, 5 }; int lengthOfNumbers = numbers.Length; Arr

  • C#检查指定对象是否存在于ArrayList集合中的方法

    本文实例讲述了C#检查指定对象是否存在于ArrayList集合中的方法.分享给大家供大家参考.具体分析如下: C#的ArrayList提供了一个专用的Contains方法来检测ArrayList是否包含指定的对象,返回值是一个bool类型 ArrayList alcollect = new ArrayList(); // Add individual items to the collection string str = "learn csharp"; alcollect.Add(s

  • 浅谈对c# 面向对象的理解

    一.了解面向对象 1.概念基本理解:1).一个个体可以看做是一个对象,例如:人这个个体: 2).有共同属性的一类作为一个个体,例如:学生.白领.农民工: 3).结构体是用户自定义的数据类型,可以定义不同数据类型的变量,结构体也是面向对象的核心: 2.基本特性: 1)封装:是隐藏信息的特性,具有"封装"意识,是掌握面向对象分析与设计技巧的关键. 最简单的理解:创建一个对象的整体,使对象的属性可以具有赋值.取值的功能,也就是对象中的变量可以赋值.取值.,是一种认为的抽象出来的对象的概念.

  • C#编程实现对象与JSON串互相转换实例分析

    本文实例分析了C#编程实现对象与JSON串互相转换的方法.分享给大家供大家参考,具体如下: DoNet2.0 需要借助于Newtonsoft.Json.dll 代码如下: using System; using System.IO; using System.Text; using Newtonsoft.Json; namespace OfflineAcceptControl.UCTools { public class JsonTools { // 从一个对象信息生成Json串 public

随机推荐