目录
7.1 SqlDataAdapter介绍
7.2 SqlDataAdapter创建
7.3 填充数据集
7.4 SqlDataAdapter更新数据
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 推荐
// conn连接对象 sql T-SQL语句或存储过程名
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = new SqlCommand(sql, conn);
2.通过一个SqlCommand对象创建adapter 推荐
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter adapter1 = new SqlDataAdapter(cmd);
3.通过查询语句和连接对象创建adapter (如果是无参查询,经常采用的方式)
SqlDataAdapter adapter2 = new SqlDataAdapter(sql, conn);
4.查询语句 和 连接字符串,也可以创建adapter 不推荐
SqlDataAdapter adapter3 = new SqlDataAdapter(sql, connStr);
7.3 填充数据集
DataAdapter可以填充 DataSet 或 DataTable ======> Fill方法
连接与断开两种方式填充数据的执行机制
断开式 没有显式打开连接 =====> 不用打开数据库连接???? ------>当然不是
DataAdapter来做这件事——打开连接-----获取数据------填充到Ds /dt-----自动关闭连接
断开式给我们的错觉就是:没有与数据库建立连接
其实不是,只是这个过程都由DataAdapter来完成.
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
//conn Closed状态
da.Fill(dt); //da 打开连接,获取数据,填充到dt中,断开连接
//conn Closed状态
}
连接式 显式打开连接 ,显式关闭连接
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配置相关的命令
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命令
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 特点: 灵活性大,占用内存大、不用一直占用连接