zoukankan      html  css  js  c++  java
  • 数据库之SqlDataAdapter

    SqlDataAdapter 类 表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。无法继承此类。 命名空间:System.Data.SqlClient 程序集:System.Data(在 system.data.dll 中) SqlDataAdapter 是 DataSet 和 SQL Server 之间的桥接器,用于检索和保存数据。SqlDataAdapter 通过对数据源使用适当的 Transact-SQL 语句映射 Fill(它可更改 DataSet 中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet 中的数据)来提供这一桥接。 当 SqlDataAdapter 填充 DataSet 时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非 MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用 FillSchema,让 SqlDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。有关更多信息,请参见 向 DataSet 添加现有约束。 SqlDataAdapter 与 SqlConnection 和 SqlCommand 一起使用,以便在连接到 SQL Server 数据库时提高性能。 SqlDataAdapter 还包括 SelectCommand、InsertCommand、DeleteCommand、UpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。 当创建 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);

    执行以上代码后,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);

            在TableMappings集合时,它将查看MissingMappingAction属性的值来决定如何操作。

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

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

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

  • 相关阅读:
    RabbitMQ学习总结(5)——发布和订阅实例详解
    RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
    RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
    RabbitMQ学习总结(3)——入门实例教程详解
    RabbitMQ学习总结(3)——入门实例教程详解
    RabbitMQ学习总结(2)——安装、配置与监控
    RabbitMQ学习总结(2)——安装、配置与监控
    ActiveMQ学习总结(4)——业界消息队列简介
    ActiveMQ学习总结(4)——业界消息队列简介
    华为云ModelArts图深度学习,学习知识还能考取微认证
  • 原文地址:https://www.cnblogs.com/jacksundatashare/p/5074107.html
Copyright © 2011-2022 走看看