目录
[7.1 SqlDataAdapter介绍](#7.1 SqlDataAdapter介绍)
[7.2 SqlDataAdapter创建](#7.2 SqlDataAdapter创建)
[7.3 填充数据集](#7.3 填充数据集)
[7.4 SqlDataAdapter更新数据](#7.4 SqlDataAdapter更新数据)
[7.5 DataReader与DataAdapter](#7.5 DataReader与DataAdapter)
7.1 SqlDataAdapter介绍
SqlDataAdapter(桥接器) :DataSet 与数据库 之间用于检索和保存数据的桥梁。
SqlDataAdapter类 ------ 填充DataSet 以及更新数据源 的一组数据库命令 和一个数据库连接 。是DataSet 和SQLServer 之间的桥接器。
它是如何提供桥接的?
------ 1)通过 Fill 方法将数据填充到 DataSet里
------ 2)通过Update 方法将更改的数据更新到数据库 ,使数据保持一致。
SqlDataAdapter 对数据的操作也是建立在SqlCommand基础之上的。
它有 4个重要属性
SelectCommand ------查询命令
InsertCommand ------插入命令
UpdateCommand ------更新命令
DeleteCommand ------ 删除命令
7.2 SqlDataAdapter创建
1.设置SelectCommand 推荐
cs
// conn连接对象 sql T-SQL语句或存储过程名
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(sql, conn);
2.通过一个SqlCommand对象 创建adapter 推荐
cs
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
3.通过查询语句 和连接对象 创建adapter (如果是无参查询,经常采用的方式)
cs
SqlDataAdapter adapter2 = new SqlDataAdapter(sql, conn);
4.查询语句 和 连接字符串 ,也可以创建adapter 不推荐
cs
SqlDataAdapter adapter3 = new SqlDataAdapter(sql, connStr);
7.3 填充数据集
DataAdapter可以填充 DataSet 或 DataTable ======> Fill方法
连接与断开 两种方式填充数据的执行机制
断开式 没有显式 打开连接 =====> 不用打开数据库连接???? ------>当然不是
DataAdapter来做这件事------打开连接-----获取数据------填充到Ds /dt-----自动关闭连接
断开式给我们的错觉 就是:没有与数据库建立连接
其实不是 ,只是这个过程都由DataAdapter来完成.
cs
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
//conn Closed状态
da.Fill(dt); //da 打开连接,获取数据,填充到dt中,断开连接
//conn Closed状态
}
连接式 显式打开 连接 ,显式关闭连接
cs
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
conn.Open();
//conn是Open状态
da.Fill(dt); //填充到dt中
//conn仍然是Open状态
conn.Close();
}
区别 :速度上 ,连接式的速度肯定要比断开式 要快
7.4 SqlDataAdapter更新数据
SqlDataAdapter还可以将DataSet或DataTable中更改的数据更新到数据源。
更新方式 Update (ds/dt/Rows)
由于DataRow行有个RowState 属性 ---行状态: Added 已添加 Modified 已修改 Deleted 已删除
DataTable中新加的行 ,行状态是:Added
DataTable中行修改 了信息,行状态是:Modified
DataTable中删除 的行,行状态是:Deleted
SqlDataAdapter更新数据,就是利用DataSet或DataTable中行的状态来完成的。
当然,SqlDataAdapter实现更新功能,还需要配置对应的命令。
配置对应命令有2种方式:
1.使用SqlCommandBuilder类 ---自动为DataAdapter配置相关的命令
cs
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
da.Update(dt);
}
2.手动配置SqlCommand :
Modified---已修改的---配置UpdateCommand命令;
Added---已添加的----配置InsertCommand
命令;
Deleted---已删除的----配置DeleteCommand命令
cs
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sqlCards, conn);
//配置新增命令
SqlCommand insertCmd = new SqlCommand("insert into CardTypeInfos(CTypeName,Remark) values (@typeName,@remark)", conn);
SqlParameter[] parasInsert =
{
new SqlParameter("@typeName",SqlDbType.NVarChar,20,"CTypeName"),
new SqlParameter("@remark",SqlDbType.NVarChar,500,"Remark")
};
insertCmd.Parameters.AddRange(parasInsert);
da.InsertCommand = insertCmd;
//配置修改命令
SqlCommand updateCmd = new SqlCommand("update CardTypeInfos set CTypeName=@typeName,Remark=@remark where CTypeId=@typeId", conn);
SqlParameter[] parasUpdate =
{
new SqlParameter("@typeName",SqlDbType.NVarChar,20,"CTypeName"),
new SqlParameter("@remark",SqlDbType.NVarChar,500,"Remark"),
new SqlParameter("@typeId",SqlDbType.Int,4,"CTypeId")
};
updateCmd.Parameters.AddRange(parasUpdate);
da.UpdateCommand = updateCmd;
//配置删除命令
SqlCommand delCmd = new SqlCommand("delete from CardTypeInfos where CTypeId=@typeId", conn);
SqlParameter[] parasDelete =
{
new SqlParameter("@typeId",SqlDbType.Int,4,"CTypeId")
};
delCmd.Parameters.AddRange(parasDelete);
da.DeleteCommand = delCmd;
//然后调用更新方法即可
da.Update(dt);
}
7.5 DataReader与DataAdapter
1.相同点 : 执行查询 ,将数据读取出来 ,返回一个或多个结果集
SqlDataReader : 提供一种从数据库中读取数据的流的方式
SqlDataAdapter :DataSet与数据库之间的一个桥接器 . Fill方法填充数据
2.性能对比 :从速度、占用内存、连接状态、适用数据量、读取方式、是否可读 几方面比较。
|------|------------------|-------------|-------------|
| | DataReader | DataAdapter | |
| 速度 | 快 | 慢 | (数据小 速度不明显) |
| 数据量 | 小 | 大 | |
| 内存 | 小 | 大 | |
| 连接 | 一直占用 | 断开与连接 | |
| 读取方式 | 从头读到尾、一条一条读、只进不退 | 任意读取 | |
| 灵活度 | 不灵活 | 灵活 | |
| 是否读写 | 只读,不能修改 | 可读可写 | |
使用选择:
1.不要求随意读取,不修改,数据量小 的情况下
------SqlDataReader 特点: 速度快,占用内存小
2.可以随意读取,可以修改,数据量大 的情况
------SqlDataAdapter 特点: 灵活性大,占用内存大、不用一直占用连接