SqlDataAdapter类

SqlDataAdapter类常用操作

  SqlDataAdapter常用于从数据库中返回一个结果集时。

  常用操作:

  Fill();

  示例:

        static void Main(string[] args)
        {
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
            SqlConnection conn = new SqlConnection(str);
            string strSql = "SELECT * FROM Person";
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter(strSql, conn);
            da.TableMappings.Add("Table","Person");     //指定原表数据与DataTable的映射关系
            da.Fill(ds,"Person");           //将数据填充到指定的DataTable

            foreach (DataRow dr in ds.Tables["Person"].Rows)
            {
                Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
            }

            //当然也可以直接Fill,DataTable
            DataTable dt = new DataTable();
            da.Fill(dt);        //当然Fill两次这里会有问题
            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr["Id"].ToString() + dr["Name"].ToString() + dr["Age"].ToString());
            }

            Console.ReadKey();
        }

  1、多次开启关闭连接的问题

  也许我们已经留意到,使用SqlDataAdapter 不需要打开和关闭数据库连接。如果调用SqlDataAdapter的Fill方法,并且其SelectCommand属性的SqlConnection是关闭状态,则SqlDataAdapter会自动打开它,然后提交查询,获取结果,最后关闭连接。如果在调用Fill方法前,SqlConnection是打开的,则查询执行完毕后,SqlConnection 还将是打开的,也就是说SqlDataAdapter会保证SqlConnection的状态恢复到原来的情形。   看来SqlDataAdapter还是非常人性化的。但是这样会产生一个问题。假如数据库连接原本是关闭的,在查询的时候并没有打开,而直接Fill了两次,这样会导致数据库连接被打开和关闭了两次。这样是会影响效率的。在调用Fill时各打开和关闭了一次。   为了避免多次打开和关闭数据库连接,我们可以这样:

  cn.Open();
  da.Fill(ds,"Person");
  da.Fill(dt);
  cn.Close();

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

  假如我们多次调用了Fill方法Fill同一个DataTable

  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中删除。这就导致了数据更新的问题。

  InsertCommand

       static void Main(string[] args)
        {
            //INSERT实例,好复杂
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";
            SqlConnection conn = new SqlConnection(str);

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Age", typeof(int));
            SqlDataAdapter adapter = new SqlDataAdapter();
            //adapter.Fill(dt);

            dt.Rows.Add(new object[] { "5", "曹操", "29" });
            adapter.InsertCommand = new SqlCommand("INSERT INTO Person(Id,Name,Age) values(@ID,@Name,@Age)", conn);
            adapter.InsertCommand.Parameters.Add("Id", SqlDbType.Int);
            adapter.InsertCommand.Parameters.Add("Name", SqlDbType.VarChar);
            adapter.InsertCommand.Parameters.Add("Age", SqlDbType.Int);

            adapter.InsertCommand.Parameters["Id"].SourceColumn = "Id";
            adapter.InsertCommand.Parameters["Name"].SourceColumn = "Name";
            adapter.InsertCommand.Parameters["Age"].SourceColumn = "Age";

            adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
            //adapter.Fill(dt);
            if (dt.Rows.Count > 0)
            {
                adapter.Update(dt);
            }

            Console.ReadKey();
        }

  UpdateCommand

        static void Main(string[] args)
        {
            //Update实例
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";

            using (SqlConnection conn = new SqlConnection(str))
            {
                conn.Open();
                DataSet ds = new DataSet();
                string sql = "select * from Person";
                SqlDataAdapter adapate = new SqlDataAdapter(sql, conn);
                adapate.Fill(ds, "Person");

                ds.Tables["Person"].Rows[0]["Name"] = "改改改";

                //动态生成的UpdateCommand必须要有主键
                SqlCommandBuilder builder = new SqlCommandBuilder(adapate);
                adapate.Update(ds, "Person");
            }
            Console.ReadKey();
        }

  DeleteCommand

        static void Main(string[] args)
        {
            //Delete实例
            string str = "server=CZZ;database=Test;uid=sa;pwd=123;Asynchronous Processing=true";

            using (SqlConnection conn = new SqlConnection(str))
            {
                DataSet ds = new DataSet();
                string sql = "SELECT * FROM Person";
                SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
                adapter.Fill(ds, "Person");
                adapter.DeleteCommand = new SqlCommand("DELETE FROM Person WHERE [email protected]", conn);
                adapter.DeleteCommand.Parameters.Add("Id", SqlDbType.Int);
                adapter.DeleteCommand.Parameters["Id"].SourceColumn = "Id";
                //删除第一行
                ds.Tables["Person"].Rows[0].Delete();
                Console.WriteLine(ds.Tables["Person"].Rows.Count);
                adapter.Update(ds.Tables["Person"]);
            }

            Console.ReadKey();
        }
时间: 2024-10-08 07:22:59

SqlDataAdapter类的相关文章

ADO.NET之填充DataSet类

主要使用数据适配器SqlDataAdapter类进行填充DataSet类 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; namespace ConsoleApplication1 { class Progr

Java进击C#——语法之ADO.NET

本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分的知识点了.笔者根据使用数据库方式的不同又分为有线连接和无线连接(关于有线和无线的叫法是笔者个人定义的.因为看了不同的书里面很多叫法).不管是什么样子的叫法.只要明白有线是保持连接的状态下操作数据库.而无线是连接之后复制一份副本,关闭连接,对副本进行操作之后,在连接更新数据库.笔者认为如果只是使用的

ADO.NET的学习

ADO.NET的几个对象 Connection:管理数据库的连接 Command:对数据库执行命令 DataReader:数据流读取器,返回的数据都是快速的且只是"向前"的数据流.无法实例化,只能通过Command创建 DateSet:缓存数据,对数据进行操作 DataAdapter:数据适配器,数据库和DataSet的桥梁 ADO.NET命名空间 注:图取自网络 常见的是SQL数据源 引用命名空间: using System.Data.SqlClient; 一.Connection类

C#操作MYSQL数据库

目录 1.准备步骤 2.MYSQL操作流程 3.MYSQL的C#中的类 4.简单实例 总结:可以把对数据库的操作写成一个个的函数,写到一个helpsql类中,到时候使用的时候就可以直接调用,MYSQL和SQL SERVER 操作是一样的,只不过就是MYSQL要自己下载API 接口,SQL SERVER 不用下载,其他的操作都是一样的.花了一个的时间写,写博客真是累啊,写博客要趁热打铁,昨晚项目后要马上开始记录,不要拖,不然就当时候忘了又要重新开始.还有碰的很好的博客,可以转载过来当做资料开看,应

你必须知道的ADO.NET(九) 深入理解DataAdapter(下)

摘要 由于各种原因,很久没有更新博客了!期间,几分迷茫,几分失落.令人欣慰的是,园子里还有很多热心的读者,都期待我更新博客.想到自己的文章,能对园友有所帮助,我又重拾久违的文笔,娓娓道来,朴实而不做作.在上一篇文章<你必须知道的ADO.NET(八) 深入理解DataAdapter(上)>中,我主要介绍了DataAdapter的工作原理以及基本功能.在本文中,我将通过实例的方式讲解如何使用DataAdapter对象. 目录 如何构造一个DataAdapter对象? 填充数据到DataSet 总结

SQL语法和ADO.NET总结

一.SQL语法 1.查询语句 select select * from 表名 where 查询条件 2.删除语句 delete delete 表名 where 删除条件 3.插入语句 insert insert into 表名(字段1.字段2) values('值1','值2') 4.修改语句 update update 表名 set 字段=新值 where 修改条件 5.Sql语句操作数据库和表 drop table 表名                 //删除数据表 create data

ADO.NET SQL

数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一 写在前面:前面介绍了数据库系统的基本概念,SQl语句基本使用方法,接下来通过学习具体语言和具体数据库结合的应用开发来体会数据库原理及其应用.关于ADO.NET及基于此平台的开发内容太多,我们要做的是从最简单的开始,本文将会给出使用ADO.NET类库访问SQL Server2008的实例. 1.ADO.NET对象模型简介 ADO.NET 是一组向 .NET 程序员公开数据访问服务的类.ADO.NET 为创建分布式数

C#与数据库访问技术总结(十四)之DataAdapter对象

DataAdapter对象 DataAdapter对象主要用来承接Connection和DataSet对象. DataSet对象只关心访问操作数据,而不关心自身包含的数据信息来自哪个Connection连接到的数据源, 而Connection对象只负责数据库连接而不关心结果集的表示. 所以,在ASP.NET的架构中使用DataAdapter对象来连接Connection和DataSet对象. 另外,DataAdapter对象能根据数据库里的表的字段结构,动态地塑造DataSet对象的数据结构.

【145】.NET Framework类库索引

C#编程基础: A1 ………… 基础A2 ………… using 关键字A3 ………… as 关键字A4 ………… is 关键字A5 ………… switch 关键字A6 ………… return 语句关键字A7 ………… enum 关键字A8 ………… Enum 类A9 ………… Struct 类型 G1 ………… 数组G2 ………… String 类G3 ………… StringBuilder 类G4 ………… Convert 类G5 ………… 可空类型 int? & double? & bo