第三章:数据集DataSet对象

本章目标

  1. 熟练掌握DataSet对象基本概念
  2. 熟练掌握DataAdapter 对象的基本使用
  3. 会使用DataSet数据集对象处理数据

本章内容

为什么要使用DataSet对象

问题1:在前两章中学习到DataReader对象可以查询数据,但是不能在查询出来的数据进行修改操作,因为DataReader对象是只读,那么如果要将查询出来的数据进行修改操作呢?怎么办?

问题2:我们知道使用DataReader和Command对象时必须保持数据库的连接(加大服务器负担),连接断开后就无法使用了?

综上二个问题,DataSet就是最好的解决方案,可以解决以上二个问题,所以DataSet是一个很强大的组件,它的特点是可以在断开连接的情况下查询和修改大量的数据,这是很有意义的。因为一个联网的软件系统将会存在大量的客户端需要连接服务器端的数据库,如果都需要保持连接,服务器的负载将会很大,这样就会影响软件系统的响应速度(比如QQ)。如果客户端获得数据后断开连接,这样服务器的负载就会小得多。DataSet就是在这种目的下被设计出来的。

1713858180167

什么是DataSet

​ 概念:DataSet(数据集)是一个临时的数据库,它的数据是保存在内存中的,它独立于任何数据库,也就是DataSet可以保存所有类型数据库的数据

1713858382824

DataSet结构

img

概述:通过前面的介绍,大家应该对DataSet的概念有了一个基本的认识,我们说它是一个临时的数据库,其实DataSet的基本结构也类似一个数据库,我们知道数据库中有多张表,每张表又包括多行数据,每行数据又包括多列。DataSet的结构也是这样的,DataSet里有一个数据表的集合,包括多个DataTable数据表,每个DataTable又有数据列的集合和数据行的集合,包含多个数据列DataColumn和数据行DataRow。

也可以简单用下面这图理解DataSet结构:

img

如何创建DataSet对象

  1. 创建DataSet对象

    语法:DataSet ds=new DataSet();DataSet ds=new DataSet("数据集名称");

    示例:

    1
    2
    3
    DataSet dataSet=new DataSet();

    DataSet dataSet = new DataSet("MySchool");//指定数据集名称
  2. 创建DataTable对象

    1. 创建DataTable对象的两种方式:

      方式一:

      1
      2
      DataTable dt=new DataTable(表格名称);
      DataTable dt=new DataTable();//系统会生成表格名称Table1

      方式二:通过DataSet创建

      1
      2
      DataSet ds = new DataSet();
      DataTable dt = ds.Tables.Add(表格名称);
  3. 在DataTable中添加列

    1
    2
    3
    4
    DataTable dt = new DataTable();
    dt.Columns.Add("列名1", typeof(System.Data.SqlTypes.SqlString));
    dt.Columns.Add("列名2", typeof(System.Data.SqlTypes.SqlInt32));
    ......

    注意:由于SQL Server数据库中的有些数据类型(如SqlDateTime、SqlDecimal和SqlString等)和公共语言运行库(CLR)不相同,要将创建的表保存到SQL Server数据库中,要使用System.Data.SqlType命名空间中提供的SQL Server数据类型。

  4. 在DataTable对象中创建行

    由于DataTable对象的每一行都是一个DataRow对象,所以创建行时可以利用DataTable对象的NewRow方法创建一个DataRow对象,并设置新行中各列的数据,然后利用Add方法将DataRow对象添加到表中。

    1
    2
    3
    4
    DataRow row = dt.NewRow( );//创建行对象
    row["列名1"] = “张三”;//指定行中的列,且赋值
    row["列名2"] = 20;
    dt.Rows.Add(row);//将行添加到DataTable中
  5. 获取表格中的数据

    1
    2
    3
    DataRow drData = dt.Rows[0];//获取行数据
    int id = Convert.ToInt32(drData["id"].ToString());//通过列获取指定数据
    string gradeName = drData["gradeName"].ToString();

    完整案例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    //创建DataSet对象,且名称为GcSchool
    DataSet ds=new DataSet("GcSchool");

    //创建DataTable对象
    DataTable dt = ds.Tables.Add("Grade");

    //给表格添加列
    dt.Columns.Add("id", typeof(System.Data.SqlTypes.SqlInt32));
    dt.Columns.Add("gradeName", typeof(System.Data.SqlTypes.SqlString));

    //创建行对象DataRow
    DataRow dr1 = dt.NewRow();
    dr1["id"] = 1;
    dr1["gradeName"] = "ai-1";

    DataRow dr2 = dt.NewRow();
    dr2["id"] = 2;
    dr2["gradeName"] = "ai-2";

    //添加行对象
    dt.Rows.Add(dr1);
    dt.Rows.Add (dr2);
    //获取数据
    Console.WriteLine("编号\t名称");
    foreach (DataRow dr in dt.Rows)
    {
    Console.WriteLine(dr["id"] + "\t" + dr["gradeName"]);

    }

认识DataAdapter 对象

  1. 为什么要使用DataAdapter对象?

    概述:我们知道了DataSet对象的作用,那么DataSet中的数据是怎么放进去的呢?这就需要用到数据适配器DataAdapter了,还是拿刚才的例子说,我们的临时仓库(数据集)要从仓库(数据库)运货(数据),它们之间就需要建立一条公路(数据库连接),而路上运货的车就是数据适配器了。所以DataAdapter的主要作用就是负责给数据集填充数据了。

    1713862813115

  2. 如何使用DataAdapter对象

    1. 不同的数据库,命名空间不一样,我们要用的就是SqlDataAdapter

      命名空间 对应的 DataAdapter 对象
      System.Data.SqlClient SqlDataAdapter
      System.Data.OleDb OleDbDataAdapter
      System.Data.Odbc OdbcDataAdapter
      System.Data.OracleClient OracleDataAdapter
    2. DataAdapter对象的主要属性和方法:

      属性 说明
      SelectCommand 从数据库检索数据的 Command 对象
      方法 说明
      Fill 向 DataSet 中的表填充数据
      Update 将 DataSet 中的数据提交到数据库

DataSet使用步骤

  1. 创建DataSet对象,同上创建模式

    1
    DataSet ds=new DataSet();
  2. 创建SqlDataAdapter 对象

    方式一:

    1
    SqlDataAdapter 对象名 = new SqlDataAdapter(查询用sql语句, 数据库连接);

    方式二:

    1
    2
    3
    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand command = new SqlCommand(查询用sql语句, 数据库连接);
    adapter.SelectCommand = command;
  3. 填充DataSet对象

    1
    DataAdapter对象. Fill(数据集对象, "数据表名称");

    注意:

    使用DataAdapter时无需显示打开或关闭Connection对象。

  4. 完整案例:实现查询年级

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
    SqlConnection conn = new SqlConnection(connString);

    //创建数据集对象
    DataSet ds= new DataSet();

    //定义查询Grade表的Sql语句
    string sql = "select gradeId,gradeName from Grade";

    //方式一:创建DataAdapter对象,直接指定sql语句和连接对象
    //SqlDataAdapter sda = new SqlDataAdapter(sql,conn);

    //方式二:创建DataAdapter对象,通过属于SelectCommand
    SqlDataAdapter sda = new SqlDataAdapter();
    SqlCommand cmd = new SqlCommand(sql,conn);
    sda.SelectCommand = cmd;

    sda.Fill(ds,"Grade");//填充数据集

    Console.WriteLine("编号\t名称");
    foreach (DataRow dr in ds.Tables["Grade"].Rows)
    {
    //方式一:通过列名获取数据
    //Console.WriteLine(dr["gradeId"] + "\t" + dr["gradeName"]);

    //方式二:通过索引获取数据
    Console.WriteLine(dr[0] + "\t" + dr[1]);
    }

    Console.ReadKey();

更新数据源

  1. 问题:如何将修改后的数据更新到数据库?

    使用 DataAdapter 的 Update() 方法

    1713864708127

  2. DataAdapter的Update()方法

    1. 作用:

      把数据集中修改过的数据提交到数据源

    2. 语法:

      1
      dataAdapter.Update(数据集对象, "数据表名称");

      相关说明:

      调用相应的命令执行:UpdateCommand、InsertCommand、DeleteCommand

  3. SqlCommandBuilder 对象

    1. 作用:利用 SqlCommandBuilder 对象能够自动生成

      INSERT 命令:InsertCommand

      UPDATE 命令:UpdateCommand

      DELETE 命令:DeleteCommand

    2. 语法:

      1
      2
      SqlCommandBuilder builder = 
      new SqlCommandBuilder(已创建的DataAdapter对象);

      注意事项:

      使用SqlCommandBuilder更新数据库只能用于单表操作,且查询语句中包含主键列

  4. 具体步骤:

    1. 自动生成用于更新的相关命令

      1
      2
      3
      SqlCommandBuilder builder = 
      new SqlCommandBuilder(已创建的DataAdapter对象);

    2. 将 DataSet 的数据提交到数据源

      1
      DataAdapter对象. Update(数据集对象, "数据表名称字符串");
    3. 示例:

      1
      2
      3
      4
      ds.Tables["Grade"].Rows[0]["gradeName"] = "AI第一学期";//修改表格中的数据

      SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sda);
      sda.Update(ds, "Grade");

本章作业

  1. 使用DataSet数据集完成上一章的所有查询相关作业