主要内容:
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. 关系与约束
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小动画,但有的去浏览时不动,很大可能是服务器被屏蔽,因为系统在没有任何发动的情况下有时候是好的,可以另存为到本地看看。)