第三十一讲 : DataSet和DataAdapter(上)

主要内容:
    1. DataSet和DataAdapter简介
        1. DataAdapter用于从数据源检索数据并填充
        2. DataSet中的表。DataAdapter还可将DataSet所做更改解析回数据源
        
        实例:
        {
            string constr = "server=root-pc; database=hrms; uid=sa; pwd=' 000000'";

            SqlConnection conn = new SqlConnection(constr);

            string sql = "select bh as 员工编号,xm as 姓名,xb from employee";

            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);

            DataSet ds = new DataSet();

            sda.Fill(ds);

            dataGridView1.DataSource = ds.Tables[0];
        }
        
        
    2. 填充多张表到DataSet
        SqlDataAdapter类有四个重载
            SelecteCommand属性
            SelecteSqlconnection属性
        dataGridView控件的使用
            行:Rows
            列:Cells
            
        填充表是使用DataAdapter对象的fill方法
        
        DataSet是一个表的集合,可以存储多张表
        如:
        SqlDataAdapter sda = new SqlDataAdapter(sql, conn);

            DataSet ds = new DataSet();

            sda.Fill(ds);
        fill方法就是将通过连接对象和命令对象获取的数据填充到DataSet对象中去。然后再通过DataSet对象中的表集合属性读取表中的数据。
        如:
        dataGridView1.DataSource = ds.Tables[0];
        
    3. DataSet数据表与关系
        DataSet多张表的表名存在大小写区分
        
        DataTable对象 和 DataRelation对象
        
        DataTable是创建表的类
        如:
        DataTable tbl=new DataTable("users")
        即创建了一个表名为users的表
        表有行集和列集组成,所以通过tbl对象就可以调用Rows和Columns两上集合,并从中读取数据。
        
        DataRow 和 DataColumn是定义表的行和列变量两个数据类型。
        如:
        //创建表,并为此表添加列
        DataTable dt2 = ds3.Tables.Add("NewTable2");

        DataColumn col2 = dt2.Columns.Add("ID",typeof(int));//添加列

        //定义列属性
        col2.AllowDBNull = false;//值不能为空
        //col2.MaxLength = 10;//最大长度10
        col2.Unique = true;//值的唯一性为真

        //为表定义一个主键约束
        dt2.PrimaryKey = new DataColumn[] { dt2.Columns["ID"] };

        //添加一列
        DataColumn col3 = dt2.Columns.Add("xm",typeof(int));
        col3.AutoIncrement = true;//定义列的自增长属性为真
        col3.AutoIncrementSeed = 1;//自增长的种子为1
        col3.AutoIncrementStep = 1;//增长的步幅为1
        col3.ReadOnly = true;//定义此列为只读属性

        //再加一列
        DataColumn col4 = dt2.Columns.Add("sum",typeof(int),"ID*xm");

        //======================================================
        //往表中添加行
        DataRow r1 = ds3.Tables["NewTable2"].NewRow();

        r1[0] = 100;//为行的第一列赋值

        object[] z = { 100};//定义object对象集合,存储行中的各列的值

        ds3.Tables["NewTable2"].LoadDataRow(z, false);

        label3.Text = dt2.Rows[0][dt2.Columns[0]].ToString();
        label3.Text += "\n"+dt2.Rows[0][dt2.Columns[1]].ToString();
        label3.Text += "\n" + dt2.Rows[0][dt2.Columns[2]].ToString();
        
        注意:也可以以实例化的式创建行和列
        如:
        DataCloumn col=new DataCloumn();
        DataRow row=table.NewRow();//创建行需要使用表的NewRow()方法
        
        //为列指定数据类型
        col.DataType=System.Type.GetType("System.Int32");
        
        col.ColumnName="Hello";//定义列名属性
        
        //创建表间关系
        使用DataRelation对象
        DataRelation relation=new DataRelation(约束名,父表主键,子表主键);
        
        //将这个关系再添加到子表中去
        ds.Tables["子表名"].ParentRelations.Add(relation);
        
        //获取dataGridView对象中某单元格的值
        dataGridView.CurrentRow.Cells[0].value
        CurrentRow:当前行属性
        Cells:控件的列集合
        
        //支持排序,筛选,搜索的DataView类
        DataView dv=ds.Tables["表名"].DefaultView;
        //设置搜索条件
        dv.RowFilter="表中的列名="+条件值
        //指定到数据源
        dataGridView.DataSource=dv;
        
        
    4. 关系与约束

    5. 向DataSet中的表添加约束


比着老师的例子,完完整整的敲了一遍代码,争取理解每一行代码的含义,唯一搞不清楚的就是列属性的ColumnName和Caption,百度了一下,说的也是不清不楚的,但最重要的是不影响建表和操作。

如果我把一个的字段属性ColumnName="a", Caption="A",在测试中列标题显示的是a. 如果说Caption这个属性是给客户看的,但是为啥列标题显示的是表字段名呢?我试着设置row["A"]="test"时,提示是A是不是属于表的属性,就是只能通过ColumnName属性对表字段进行赋值。一头雾水!

原代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace WF31
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //数据库连接字符串
        string strConn = "server=.; database=hrms; uid=sa; pwd=123123;";
        //数据检索命令
        string sqlSelect = "select bh,xm,xb,dz,bm from employee";

        DataSet ds;//创建一个数据集对象引用

        /// <summary>
        /// 窗口加载
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                SqlCommand cmd = new SqlCommand(sqlSelect, conn);
                cmd.CommandType = CommandType.Text;
                SqlDataAdapter sda = new SqlDataAdapter();//创建一个数据适配器
                ds = new DataSet();//创建一个数据集对象,默认数据集包含一个空表
                sda.SelectCommand = cmd;//设置数据适配器的检索命令对象的属性
                sda.Fill(ds);//使用数据适配器的Fill方填充数据到数据集的默认表中
                //以下是绑定数据到DataGridView控件,只能以表数据方式进行
                //由于数据集中包含一个默认空表,且只有一个表,在不知道表名的情况下,使用
                //DataSet数据集的表集合中索引,如下
                dataGridView1.DataSource = ds.Tables[0];//绑定数据表到控件

            }
        }

        /// <summary>
        /// 创建表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            DataTable table = new DataTable("Parent");//创建一个表对象,并初始化表名属性
            DataColumn column;//定义一个列引用
            DataRow row;//定义一个行引用

            column = new DataColumn();//创建一个表的列对象
            //设置列的数据类型
            column.DataType = System.Type.GetType("System.Int32");//第一列数据类型为整型
            //设置列的名称
            column.ColumnName = "id";//这个名称为字段名称
            //指定列的读取方式
            column.ReadOnly = true;//指定为只读
            //列中的值是否为唯一值
            column.Unique = true;
            //设置列的标题
            column.Caption = "ParentId";
            //将此列添加到表的列集合中
            table.Columns.Add(column);

            //再创建一个列
            column = new DataColumn();//初始化列对象
            //设置列是否为自增列
            column.ColumnName="item";
            column.DataType=System.Type.GetType("System.String");
            column.AutoIncrement = false;
            column.Caption = "ParentItem";
            column.ReadOnly = false;
            column.Unique = false;
            table.Columns.Add(column);


            //设置表的主键,以集合的方式创建,意思就是可以通过此方式为表创建组合键
            DataColumn[] PrimaryKeyColumns = new DataColumn[1];//只包含一个主键列
            //指定主键列
            PrimaryKeyColumns[0] = table.Columns["id"];//指定字段id为此表的主键
            //再将主键绑定到表中
            table.PrimaryKey = PrimaryKeyColumns;

            

            //为上表添加数据记录,即行数据
            //老师强调了,这个行记录对象不能像列对象一个进行new DataRow;
            //而是使用上面的已经实例化好了的Table架构进行实例化
            row = table.NewRow();//使用现有的表架构来实例化行对象
            //为新建的行对象中的每一列赋值
            row["id"] = 1;
            row["item"] = "父表第一行数据";
            //将生成的行添加到表的行集合
            table.Rows.Add(row);


            //再加一行
            row = table.NewRow();
            row["id"] = 2;
            row["item"] = "父表第二行数据";
            //将生成的行添加到表的行集合
            table.Rows.Add(row);

            //再加一行
            row = table.NewRow();
            row["id"] = 3;
            row["item"] = "父表第三行数据";
            //将生成的行添加到表的行集合
            table.Rows.Add(row);

            //创建一个数据集对象
            ds = new DataSet();//初始化数据集对象
            //将表添加到数据集的表集合中
            ds.Tables.Add(table);

            //************父子表的分隔线*********************

            //接下来是创建一个子表
            table = new DataTable("Child");

            //初始化列对象
            column = new DataColumn();
            column.ColumnName = "id";
            column.DataType = System.Type.GetType("System.Int32");
            column.Caption = "ChildId";
            column.AutoIncrement = true;
            column.ReadOnly = true;
            column.Unique = true;

            table.Columns.Add(column);

            column = new DataColumn();
            column.ColumnName = "childItem";
            column.Caption = "ChildItem";
            column.DataType = System.Type.GetType("System.String");
            column.AutoIncrement = false;
            column.ReadOnly = false;
            column.Unique = false;

            table.Columns.Add(column);

            //再组建一列作为主副间的关系列
            column = new DataColumn();
            column.ColumnName = "parentId";
            column.Caption = "ParentId";
            column.DataType = System.Type.GetType("System.Int32");
            column.AutoIncrement = false;
            column.ReadOnly = false;
            column.Unique = false;
            column.AllowDBNull = false;

            table.Columns.Add(column);

            

            //为子表添加数据
            

            for (int i = 0; i < 5; i++)
            {
                row = table.NewRow();
                row["childItem"] = "子表项数据第" + i + "号";
                row["parentId"] = 1;
                table.Rows.Add(row);
            }

            

            for (int i = 5; i < 11; i++)
            {
                row = table.NewRow();
                row["childItem"] = "子表项数据第" + i + "号";
                row["parentId"] = 2;
                table.Rows.Add(row);
            }

            

            for (int i = 11; i < 15; i++)
            {
                row = table.NewRow();
                row["childItem"] = "子表项数据第" + i + "号";
                row["parentId"] = 3;
                table.Rows.Add(row);
            }

            //也将此表添加到数据集中,因为在创建表的同时初始了表名属性,可以以表名来指定表对象
            ds.Tables.Add(table);

            //最后是创建表间的关系
            //先获取父表的关系列
            DataColumn PrimaryColumn = ds.Tables["Parent"].Columns["id"];

            //获取副表的关系列
            DataColumn ChildColumn = ds.Tables["Child"].Columns["parentId"];

            //创建表间关系
            //关系类构造函数的三个参数:1.约束名,2.父表关系字段,3.子表关系字段
            DataRelation relation = new DataRelation("PCrelation", PrimaryColumn, ChildColumn);

            //将约束关系添加到子表中
            ds.Tables["Child"].ParentRelations.Add(relation);//注意子表的父关系也是一个集合

            if (ds.Tables.Count == 2)
            {
                MessageBox.Show("父表:" + ds.Tables["Parent"] + " 创建成功!\n子表:" + ds.Tables["Child"] + " 创建成功!");
            }
            else {
                MessageBox.Show("创建失败!");
            }

        }

        /// <summary>
        /// 绑定手工创建的表到控件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            dgvParent.DataSource = ds.Tables["Parent"];
            dgvChild.DataSource = ds.Tables["Child"];
        }

        private void dgvParent_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //先获取用户的选中行的主键
            string pid = dgvParent.CurrentRow.Cells[0].Value.ToString();

            //创建数据视图对象
            DataView dv = new DataView();
            dv = ds.Tables["Child"].DefaultView;
            dv.RowFilter = "parentId=" + Convert.ToInt32(pid);
            dgvChild.DataSource = null;
            dgvChild.DataSource = dv;
        }

    }
}
测试结果:(我的测试结果大多为gif小动画,但有的去浏览时不动,很大可能是服务器被屏蔽,因为系统在没有任何发动的情况下有时候是好的,可以另存为到本地看看。)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值