• C#中SqlDataAdapter的使用小结---转载


    C#中SqlDataAdapter的使用小结

    SqlDataAdapter对象

    一、特点介绍
    1、表示用于填充 DataSet 和更新 SQL Server 数据库的一组数据命令和一个数据库连接。
    2、在SqlDataAdapter和DataSet之间没有直接连接。当完成SqlDataAdpater.Fill(DataSet)调用后,两个对象之间就没有连接了。
    二、使用介绍

    1、创建SqlDataAdapter

    1. string strSQL=“Select * from Customers”;
    2. SqlCommand cmd=new SqlCommand(strSQL,cn);
    3. SqlDataAdapter da=new SqlDataAdapter();
    4. da.SelectCommand=cmd;

    2、SqlDataAdapter构造函数

    ①string strConn=“Provider=.....”;

    1. string strSQL=“select * from Customers”;
    2. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);

    ②string strConn=“Provider=.....”;

    1. SqlConnection cn=new SqlConnection(strConn);
    2. SqlDataAdapter da=new SqlDataAdapter(“select * from Customers”,cn);

    ③string strConn=“Provider=.....”;

    1. string strSQL=“select * from Customers”;
    2. SqlConnection cn=new SqlConnection(strConn);
    3. SqlCommand cmd=new SqlCommand(strSQL,cn);
    4. SqlDataAdapter da=new SqlDataAdapter(cmd);

    3、从查询中获取结果

    ①使用Fill方法

    1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
    2. DataSet ds=new DataSet();
    3. da.Fill(ds); //这里ds中的表名为Table

    ②使用Fill方法创建DataTable对象和DataColumn对象

    1. SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
    2. da.TableMapping.Add(“Table”,“Customers”);
    3. DataSet ds=new DataSet();
    4. da.Fill(ds);

    ③使用重载Fill方法

    1. SqlDataAdapter.Fill(DataSet,“Customers”);
    2. SqlDataAdapter.Fill(DataTable);
    3. SqlDataAdapter.Fill(DataSet,intStartRecord,intNumRecords,“TableName”);

    ④开放和关闭连接

        如果调用了一个SqlDataAdapter对象的Fill方法,而SelectCommand属性的Connection关闭了,那么SqlDataAdapter就会开放一个连接,然后提交查询、获取结果、最后关闭连接。如果在调用前开放了Connection,那么操作之后仍然保持开放。

    1. SqlDataAdapter daCustomers,daOrders;
    2. daCustomers=new SqlDataAdapter(“Select * from Customers”,cn);
    3. daOrders=new SqlDataAdapter(“Select * from Orders”,cn);
    4. DataSet ds=new DataSet();
    5. cn.Open();
    6. daCustomers.Fill(ds);
    7. daOrders.Fill(ds);
    8. cn.Close();

    ⑤多次调用Fill方法
        刷新DataSet中的数据,最简单的解决方法就是清空DataSet(或DataTable),然后再次调用DataAdapter对象的Fill方法。三、属性方法事件介绍 
    1、属性
    ①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState(默认为True)。
    ②DeleteCommand:获取或设置一个 Transact-SQL 语句或存储过程,以从数据集删除记录。
    ③InsertCommand:获取或设置一个 Transact-SQL 语句或存储过程,以在数据源中插入新记录。
    ④SelectCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于在数据源中选择记录。
    ⑤UpdateCommand:获取或设置一个 Transact-SQL 语句或存储过程,用于更新数据源中的记录。
    ⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
    ⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改(默认为false)。
    2、方法
    ①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
    ②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
    ③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
    ④Update:向数据库提交存储在DataSet(或DataTable、DataRows)中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。
    3、事件
    ①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
    ②RowUpdated:向数据库提交一个修改的行之后被触发。

    ③RowUpdating:向数据库提交一个修改的行之前被触发。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    SqlDataAdapter概述

    SqlDataAdapter是 DataSet和 SQL Server之间的桥接器,用于检索和保存数据。SqlDataAdapter通过对数据源使用适当的Transact-SQL语句映射 Fill(它可更改DataSet中的数据以匹配数据源中的数据)和 Update(它可更改数据源中的数据以匹配 DataSet中的数据)来提供这一桥接。当SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。

    使用方法

    1、通过连接字符串和查询语句 

    1
    2
    3
    4
    5
    6
    string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串
    strSql="SELECT * FROM 表名";
      
    SqlDataAdapter da=new SqlDataAdapter(strSql,strConn);
    DataSet ds=new DataSet();//创建DataSet实例
    da.Fill(ds,"自定义虚拟表名");//使用DataAdapter的Fill方法(填充),调用SELECT命令

    2、通过查询语句和SqlConnection对象来创建

    1
    2
    3
    4
    5
    6
    string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串 
    SqlConnection conn=new SqlConnection(strConn); 
    string strSql="SELECT * FROM 表名"
    SqlDataAdapter da = new SqlDataAdapter(strSql, conn); 
    DataSet ds=new DataSet();//创建DataSet实例 
    da.Fill(ds,"自定义虚拟表名");//使用DataAdapter的Fill方法(填充),调用SELECT命令 

     3、通过SqlCommand对象来创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串   
    SqlConnection connSql=new SqlConnection (strConn); //Sql链接类的实例化   
    connSql.Open ();//打开数据库   
    //使用SqlDataAdapter时没有必要从Connection.open()打开,   
    //SqlDataAdapter会自动打开关闭它。   
    string strSql = "SELECT * FROM 表名"; //要执行的SQL语句   
    SqlCommand cmd = new SqlCommand(strSql, connSql); 
    SqlDataAdapter da=new SqlDataAdapter(cmd); //创建DataAdapter数据适配器实例   
    DataSet ds=new DataSet();//创建DataSet实例   
    da.Fill(ds,"自定义虚拟表名");//使用DataAdapter的Fill方法(填充),调用SELECT命令   
    connSql.Close();//关闭数据库

     注意

    如果只需要执行SQL语句或SP,就没必要用到DataAdapter ,直接用SqlCommandExecute系列方法就可以了。sqlDataadapter的作用是实现DatasetDB之间的桥梁:比如将对DataSet的修改更新到数据库

    SqlDataAdapterUpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand ,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。

     

    1、在使用Fill方式时,可以指定DataTable,而不是DataSet

     

     

    1
    2
    3
    4
    5
    6
    string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串   
    strSql="SELECT * FROM 表名";   
        
    SqlDataAdapter da = new SqlDataAdapter(strSql, strConn); 
    DataTable tbl=new DataTable( ); 
    da.Fill(tbl);

     

     2、注意打开和关闭连接的处理

    在调用SqlCommand对象执行sql命令之前,需要保证与该对象关联的SqlConnection对象是打开的,否则SqlCommand的方法执行时将引发一个异常,但是我们在上面的代码中看到,SqlDataAdapter没有这样的要求。

     

    如果调用SqlDataAdapterFill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串   
    SqlConnection conn=new SqlConnection(strConn); 
    SqlDataAdapter daCustomers,daOrders; 
        
    strSql="SELECT * FROM Customers"
    daCustomers = new SqlDataAdapter(strSql, conn); 
        
    strSql="SELECT * FROM Orders"
    daOrders=new SqlDataAdapter(strSql, conn); 
       
    DataSet ds=new DataSet(); 
        
    daCustomers.Fill(ds,"Customers"); 
    daOrders.Fill(ds,"Orders");

     

     以上代码会导致连接被打开和关闭两次,在调用Fill方法时各一次。为了避免打开和关闭SqlConnection对象,在调用SqlDataAdapter对象的Fill方法之前,我们可以先打开SqlConnection对象,如果希望之后关闭连接,我们可以再调用Close方法,就像这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    conn.Open() 
    strSql="SELECT * FROM Customers"
    daCustomers = new SqlDataAdapter(strSql, conn); 
        
    strSql="SELECT * FROM Orders"
    daOrders=new SqlDataAdapter(strSql, conn); 
       
    DataSet ds=new DataSet(); 
        
    daCustomers.Fill(ds,"Customers"); 
    daOrders.Fill(ds,"Orders");
    conn.Close();

    3、多次调用Fill方法需要注意数据重复和有效更新数据的问题

    推荐的做法是,在调用Fill方法前,先删除本地DataSet中缓存的数据!

  • 相关阅读:
    ie条件注释
    浏览器兼容性
    ajax
    执行环境、变量对象、作用域链、闭包
    iPhone日历选择器效果
    fastclick源码分析
    zepto 事件模块源码分析
    阿拉伯数字转成中文数字 (支持1~9999)
    line-height学习
    运动的球(1)
  • 原文地址:https://www.cnblogs.com/bedfly/p/12212580.html
Copyright © 2020-2023  润新知