ADO.Net学习笔记(3)--初识SqlDataAdapter
时间:2011-02-21 来源:Green Billow
(一) SqlDataAdapter类剖析
SqlDataAdapter类由一系列子命令(即SqlCommand对象)和一组映射属性组成。
1.子命令
在使用SqlDataAdapter查询数据并填充DataSet时,SqlDataAdapter使用SqlCommand和SqlConnection与数据库进行通信(SqlDataAdapter在内部使用SqlDataReader获取结果,并将该信息存储在DataSet的新行中)。
SqlDataAdapter的子命令有:SelectCommand、UpdateCommand、InsertCommand、DeleteCommand。
2.TableMappings集合
TableMappings决定了SqlDataAdapter的查询结果如何映射到DataSet中。TableMappings属性返回一个DataTableMapping对象的集合。每个DataTableMapping对象都存储了数据库的表(或视图或存储过程)到DataSet相应表的一个映射。
例如:
SqlDataAdapter da;
DataSet ds;
da.TableMappings.Add("Table", "abc");
da.Fill(ds);
因为da的查询结果默认表名为“Table”,如果da的TableMappings为空,那么da就默认与DataSet中名为“Table”的表进行通信。那么,da.Fill(ds)会填充DataSet中表名为“Table”的表。但是,加上da.TableMappings.Add("Table", "abc")后,da就知道要和DataSet中名为"abc"的表进行通信了,那么da.Fill(ds)会填充DataSet中表名为“abc”的表。另外,DataTableMapping类有一个ColumnMappings属性,其返回一个DataColumnMapping对象的集合。每个DataColumnMapping对象将数据库中的一列映射到DataSet中的一列。
DataTableMapping , DataColumnMapping等映射类存在于System.Data.Common命名空间中。
(二) 创建SqlDataAdapter对象
.Net为SqlDataAdapter类提供了3个可用于简化创建过程的构造函数:
(1) SqlDataAdapter da = new SqlDataAdapter(strSQL, strConn);
strSQL是SQL选择语句,类型为string ;strConn是连接字符串,类型string。
注:这个构造函数有一个潜在缺陷。假如要创建同一连接的多个SqlDataAdapter对象,那么为每一个SqlDataAdapter对象都要创建一个新的
SqlConnection对象,这无疑是浪费系统资源的。
(2) SqlDataAdapter da = new SqlDataAdapter(strSQL, Conn);
strSQL是SQL选择语句,类型为string ;Conn是SqlConnection类型的对象。这个构造函数克服了(1)中的潜在缺陷。
(3) SqlDataAdapter da = new SqlDataAdapter(command);
command是SqlCommand类型的对象。
(三) 获取数据和更新数据
(1).Fill方法
调用SqlDataAdapter对象的Fill方法会执行存储在SqlDataAdapter对象的SelectCommand属性中的查询,并将结果存储在DataSet或DataTable中。如果当前的SqlConnection对象还没有打开,调用Fill方法时会自动打开和关闭SqlConnection对象。所以不需要使用open方法打开连接和close方法关闭连接。但是这样也有一个缺陷,假如频繁地调用FIll方法,那么就会频繁地打开和关闭SqlConnection对象,这显然会影响程序的性能,为了避免这一缺陷,可以在调用Fill方法之前调用以Open方法,在连接使用结束后再调用一次Close方法,如以下代码:
conn.Open();
da1.Fill(ds);
da2.Fill(ds);
conn.Close();
Fill方法的重载有:
1.Fill(ds) : ds是一个DataSet类型的对象;(注:如果da的TableMappings属性为空,则默认填充DataSet中名为“Table”的表)
2.Fill(ds,tableName) : ds同上,tableName是要映射的表的名称;
3.Fill(dt) : dt是一个DataTable类型的对象;
4.Fill(ds,start,Num,tableName) : ds同上,start是要填充的记录的开始序号,Num是要填充的记录数量。比如,da查询结果含100个记录,那么da.Fill(ds,0,20,"abc") 就把da查询结果的前20条记录填充到ds中名为“abc”的表中。这一重载可用于查询结果的分页显示。
(2).Update方法 用CommandBuilder来生成更新的T-SQL命令。
SqlDataAdapter的Update方法将DataSet中对应表的修改的部分保存到数据库中。这里需要注意,保存已经修改过的DataSet必须要具备有效的UpdateCommand ,否则会报错:“当传递具有已修改行的 DataRow 集合时,更新要求有效的 UpdateCommand”。 我们可以自己设置UpdateCommand属性,也可以使用SqlCommandBuilder ,在调用da的Update方法之前加上以下语句:SqlCommandBuilder CB = new SqlCommandBuilder(da);
Update方法的重载有:
1.Update(dataRows) : dataRows是一个DataRow的数组;
2. Update(ds) : ds是一个DataSet类型的对象;(注:如果da的TableMappings属性为空,那么这里默认使用名为“Table”的表进行更新,如果da中没有这一表,则会报错:Update 无法找到 TableMapping['Table'] 或 DataTable“Table”)
3. Update(dt) : dt是一个DataTable类型的对象;
4. Update(ds,talbeName) : ds同上,tableName是所要更新的表的名称。