相关文章推荐
烦恼的八宝粥  ·  [Solved] Why do we ...·  1 年前    · 
讲道义的闹钟  ·  xampp下载很慢-掘金·  1 年前    · 
SqlDataAdapter概述

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

) 我们可以通过以下三种方法来创建 SqlDataAdapter 对象:

1 、通过连接字符串和查询语句 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命令
  • 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命令

    这种方法有一个潜在的缺陷。假设应用程序中需要多个 SqlDataAdapter 对象,用这种方式来创建的话,会导致创建每个 SqlDataAdapter 时,都同时创建一个新的 SqlConnection 对象,方法二可以解决这个问题

    2 、通过查询语句和 SqlConnection 对象来创建 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命令
  • 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 对象来创建 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 (); //关闭数据库
  • 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 ();//关闭数据库 
    SqlDataAdapter da=new SqlDataAdapter(strSQL,ConnSql); //创建DataAdapter数据适配器实例DataSet ds=new DataSet();//创建DataSet实例da.Fill(ds,"自定义虚拟表名");//使用DataAdapter的Fill方法(填充),调用SELECT命令ConnSql.Close ();//关闭数据库

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

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

    string strConn = "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
  • strSql= "SELECT * FROM 表名" ;
  • SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);
  • DataSet ds = new DataSet();
  • da.Fill(ds);
  • string strConn = "uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串  
    strSql="SELECT * FROM 表名";  
    SqlDataAdapter da = new SqlDataAdapter(strSql,strConn);
    DataSet ds = new DataSet();
    da.Fill(ds);

    会在 DataSet 中创建一个新的 DataTable ,这个新的 DataTable 会拥有名为 CustomerID CompanyName 列,但是 DataTable 对象的名称是 Table ,而不是我们希望的 Customers

    这个问题,可以通过添加 TableMapping 来解决:

    string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
  • strSql= "SELECT * FROM 表名" ;
  • SqlDataAdapter da= new SqlDataAdapter(strSQL,strConn);
  • da.TableMappings.Add( "Table" "Customers" ); // 设置对象名称
  • DataSet ds= new DataSet();
  • da.Fill(ds);
  • string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串  
    strSql="SELECT * FROM 表名";  
    SqlDataAdapter da=new SqlDataAdapter(strSQL,strConn);
    da.TableMappings.Add("Table","Customers");	 // 设置对象名称
    DataSet ds=new DataSet();
    da.Fill(ds);
    其实最简洁的方法是通过使用 Fill 方法的重载,通过指定 DataTable ,像这样:

    SqlDataAdapter.Fill(DataSet,"MyTableName");

    这样就可以不必使用 TableMappings 集合。

    2 、在使用 Fill 方式时,可以指定 DataTable ,而不是 DataSet string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
  • strSql= "SELECT * FROM 表名" ;
  • SqlDataAdapter da = new SqlDataAdapter(strSql, strConn);
  • DataTable tbl= new DataTable( );
  • da.Fill(tbl);
  • string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串  
    strSql="SELECT * FROM 表名";  
    SqlDataAdapter da = new SqlDataAdapter(strSql, strConn);
    DataTable tbl=new DataTable( );
    da.Fill(tbl);
    3 、注意打开和关闭连接的处理

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

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

    这有时会导致性能问题,需要注意,例如下面的代码:

    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" );
  • 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 方法,就像这样:

    string strConn= "uid=账号;pwd=密码;database=数据库;server=服务器" ; //SQL Server链接字符串
  • strSql= "SELECT * FROM Customers" ;
  • SqlDataAdapter da= new SqlDataAdapter(strSql, strConn);
  • DataSet ds= new DataSet();
  • da.Fill(ds, "Customers" );
  • //…….
  • da.Fill(ds, "Customers" );
  • string strConn="uid=账号;pwd=密码;database=数据库;server=服务器";//SQL Server链接字符串  
     strSql="SELECT * FROM Customers";
    SqlDataAdapter da=new SqlDataAdapter(strSql, strConn);
     DataSet ds=new DataSet();
     da.Fill(ds,"Customers");
    //…….
    da.Fill(ds,"Customers");

    我们分析上面的代码,通过两次调用 Fill 方法, SqlDataAdapter 执行两次查询,并两次将查询结果保存到 DataSet 中,第一次调用在 DataSet 中创建了一个名为 Customers 的新表。第二次调用 Fill 方法将查询的结果追加到 DataSet 中的同一个表中,因此,每个客户的信息将在 DataSet 中出现两次!当然,如果数据库管理员对 Customers 表定义了主键,则 SqlDataAdapter 在天成 DataTable 时,会判断重复行,并自动丢弃掉旧的值。

    考虑一下,假定一个特定客户在第一次调用 Fill 方法时,存储于数据库中,那么 SqlDataAdapter 会将其添加到新建的 DataTable 中。如果后来这个客户被删除了,那么第二次调用 Fill 方法时, SqlDataAdapter 将不会在查询结果中找到该客户信息,但是它也不会将客户信息从 DataSet 中删除。这就导致了数据更新的问题。

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

    转载: http://blog.csdn.net/gatieme/article/details/20695853

    Winform控件优化之圆角Panel【绘制时需要注意的几点和扩展】
    圆角的实现(原理和绘制方法)之前基本都已经介绍,本篇主要是实现圆角Panel时介绍几点注意点和一些扩展。一是BackColor应始终为Transparent;二是Draw完全显示绘制出的线条...
    Windows Server IIS配置 怎么禁用不安全的SSL2.0和SSL3.0协议?
    Windows Server IIS配置 怎么禁用不安全的SSL2.0和SSL3.0协议?
    【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
    【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )
    错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
    原文:错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序. 转载于(https://social.
    Vue-router(二) 子路由(嵌套路由)
    实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件。借助 vue-router,使用嵌套路由配置,就可以很简单地表达这种关系。
    12075