• SqlDataReader和SqlDataAdapter 区别


    概述:

    一,SqlDataReader //基于连接,只读访问 适合数据量较小。

          SqlDataAdapter //基于非连接,适于数据量较大时,可以另行修改,最后再把修改结果返回给数据库。要求资源也大一点

    二,SqlDataAdapter 读取数据后将数据集放入DataSet ,DataSet 的数据存在本地客服机内存。

    三,SqlDataReader返回的是一个数据读写器,只能一条条的读,操作起来不灵活,一般在只读的时候才用到。

          SqlDataAdapter返回的是数据集或者表,可以对其中的数据作任意操作

    四,写法上不同:

         SqlDatReader执行前须先打开数据库,然后须生成一个COMMAND对象。再由COMMAND.EXECUTEREADER()方法赋值。完成后须手动关闭联接。

         SqlCommand cmd = new SqlCommand("select * from stu", conn);

                conn.Open();

                SqlDataReader rdr = cmd.ExecuteReader();

                。。。。。

                conn.close();

           SqlDataAdapter 执行时,自动打数据库,且不用Command的ExecuteReader方法进行赋值,完成后自动断开联接。

                SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);

                DataSet ds = new DataSet();

                adptr.Fill(ds, "stu");

       

       

    实例:

    1,运用SqlDataReader 读取数据

    class DataReader

        {

            static void Main()

            {

                string str = "server=localhost;uid=sa;pwd=123;database=northwind";

                SqlConnection conn = new SqlConnection(str);

                SqlCommand cmd = new SqlCommand("select * from stu", conn);

                conn.Open();

                SqlDataReader rdr = cmd.ExecuteReader();

                 DataTable table=new Datable();

                table.Load(rdr);

                 rdr.Close();

                conn.Close();

            }

    2,运用SqlDataAdapter +DataSet 读取修改数据

            

        class SqlDataAdapter

        {

            static void Main()

            {

                string str = "server=localhost;uid=sa;pwd=123;database=northwind";

                SqlConnection conn = new SqlConnection(str);

                string sql = "select * from stu";

                SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);//Adepter对象

                DataSet ds = new DataSet();//DataSet对象

                adptr.Fill(ds, "stu");//填充DataSet 并为当前表命名

                DataTableReader rdr = ds.CreateDataReader();

                while (rdr.Read())//读取表中数据

                {

                    for (int i = 0; i < rdr.FieldCount; i++)

                    {

                        Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) + "\t");

                    }

                    Console.WriteLine();

                }

            }



    使用SqlDataAdapter对象获取数据
    作者:佚名 出处:中国自学编程网收集整理   发布日期:2008-07-04  

    一.             SqlDataAdapter对象

    1. SqlDataAdapter特性

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

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

    2. SqlDataAdapter的设置

    l            SqlCommand属性

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

    l         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

    l         New 关键字

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

           SqlDataAdapter da=new SqlDataAdapter();

           da.SelectCommand=cmd;

    l         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. 获取查询中的结果

    l         使用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,而不是查询语句中所查询的表的名称。

    l         使用重载的Fill方法

             指定DataTable

    da.Fill(DataSet,”MyTableName”)// SqlDataAdapter填充指定DataSet的特定表。

    da.Fill(DataTable);// SqlDataAdapter填充已经创建的DataTable对象。

             Fill方法分页显示

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

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

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

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

    l           DataSet中数据的更新

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

    3. 将查询结果映射到DataSet

    l           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是否为当前将要使用的对象。

    l   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);

    l       MissingMappingAction属性

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

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

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

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







    关于datareader,

    datareader = this.datacommand.ExecuteReader();
         
                while (datareader.Read())
                {

    this.用户标志TextBox1.Text = datareader.GetInt32(0).ToString();
                    this.姓名TextBox.Text = datareader.GetString(1);
                    this.办公电话TextBox.Text =datareader.GetString(2);
                    this.家庭电话TextBox.Text =datareader.GetString(3);
                    this.移动电话TextBox.Text=datareader.GetString(4);
                    this.电子邮件TextBox.Text =datareader.GetString(5);
                    this.qQ号TextBox.Text =datareader.GetString(6);
                    this.单位名称TextBox.Text =datareader.GetString(7);
                    this.家庭住址TextBox.Text = datareader.GetString(8);



    它每read一次,可从datareader中读取一条记录,



    关于其它。

    由于微软提供了三套对数据库操作的库。sqlclient,odbc,oledb。

    System.data.sqlclient

    //创建一个 sqlconnection对象
                   this.sqlcomm.Connection = new SqlConnection();
                  this.sqlcomm.Connection.ConnectionString = "Data Source=DEEDB958979144C;Initial Catalog=telephonegan;Integrated Security=True";
                  this.sqlcomm.Connection.FireInfoMessageEventOnUserErrors=false;
                 //创建一个 oledbconnection对象
                 // string strcon = " provider = microsoft.jet.oledb.4.0 ; data source = telephone.mdb ";
                 // oledbconnection myconn = new oledbconnection(strcon);
                 // string strcom = " select * from books ";
                 //创建一个 dataset对象
                   mydataset = new DataSet();
                   this.sqlcomm.Connection.Open();
                   this.sqlcomm.CommandText ="select * from teleinfo";
                   SqlDataAdapter mycommand = new SqlDataAdapter();
                   mycommand.SelectCommand = this.sqlcomm;
                   mycommand.Fill(mydataset,"teleinfo");
                   this.sqlcomm.Connection.Close();
       

    即同样会存在

    syste.data.odbc;

                    System.Data.Odbc.OdbcConnection;
                    System.Data.Odbc.OdbcCommand;
                    System.Data.Odbc.OdbcDataAdapter;
                    System.Data.Odbc.OdbcDataReader;

    还同样会存在

    system.data.oledb;

    //创建一个 oledbconnection对象
                 // string strcon = " provider = microsoft.jet.oledb.4.0 ; data source = telephone.mdb ";
                 // oledbconnection myconn = new oledbconnection(strcon);
                 // string strcom = " select * from books ";

    // myconn.open();
                  // oledbdataadapter mycommand = new oledbdataadapter(strcom, myconn);
                  //   mycommand.fill(mydataset, "books");
                  //   myconn.close();

  • 相关阅读:
    (中等) HDU 1495 非常可乐,BFS。
    (简单) POJ 1562 Oil Deposits,BFS。
    (简单) POJ 3984 迷宫问题,BFS。
    动态规划(斐波那契系列)---爬楼梯
    回溯---N皇后
    回溯---数独
    回溯---分割字符串使得每个部分都是回文数
    回溯---含有相同元素求子集
    回溯---子集
    回溯---组合求和
  • 原文地址:https://www.cnblogs.com/sayhallotoyou/p/3582144.html
Copyright © 2020-2023  润新知