21.7.1 用数据适配器来填充 DataSet
前面讨论数据行的一节简要介绍了SqlDataAdapter类,使用该类的代码如下所示:
string select = "SELECT ContactName,CompanyName FROM Customers";
SqlConnection conn = new SqlConnection(source);
SqlDataAdapter da = new SqlDataAdapter(select , conn);
DataSet ds = new DataSet();
da.Fill(ds , "Customers");
突出显示的两行代码显示了SqlDataAdapter类—— 其他数据适配器在功能上实际上与SqlDataAdapter是完全相同的。
数据适配器类都派生于同一个基类,而不是一组接口,其他数据库类也是这样。继承结构如下所示:
System.Data.Common.DataAdapter
System.Data.Common.DbDataAdapter
System.Data.Odbc.OdbcDataAdapter
System.Data.OleDb.OleDbDataAdapter
System.Data.OracleClient.OracleDataAdapter
System.Data.SqlClient.SqlDataAdapter
为了把数据插入到DataSet中,需要执行某种形式的命令以选择该数据。该命令可以是SQL SELECT语句,一个存储过程的调用,或者是TableDirect命令(用于OleDb提供程序)。上面的示例使用了SqlDataAdapter的一个构造函数,把传送过来的SQL SELECT子句转换为一个SqlCommand,在适配器上调用Fill方法时执行这个命令。
在本章前面的存储过程示例中,定义了INSERT、UPDATE和DELETE命令,但没有给出一个SELECT过程,本节介绍该过程,并说明如何从SqlDataAdapter上调用存储过程,把数据填充到DataSet中。
在数据适配器上使用存储过程
首先需要定义一个存储过程, SELECT存储过程如下所示:
CREATE PROCEDURE RegionSelect AS
SET NOCOUNT OFF
SELECT * FROM Region
GO
这个存储过程可以直接输入到SQL Server查询分析器中,或者可以运行这个示例所使用的StoredProc.sql文件。
接着,需要定义一个执行该存储过程的SqlCommand,这段代码非常简单,并且大部分已经在前面“执行命令”的一节中介绍过了:
private static SqlCommand GenerateSelectCommand(SqlConnection conn )
{
SqlCommand aCommand = new SqlCommand("RegionSelect" , conn);
aCommand.CommandType = CommandType.StoredProcedure;
aCommand.UpdatedRowSource = UpdateRowSource.None;
return aCommand;
}
这个方法生成了一个SqlCommand,该SqlCommand在执行时会调用RegionSelect过程。最后是把这个命令和SqlDataAdapter类关联起来,调用Fill方法:
DataSet ds = new DataSet();
// Create a data adapter to fill the DataSet
SqlDataAdapter da = new SqlDataAdapter();
// Set the data adapter's select command
da.SelectCommand = GenerateSelectCommand (conn);
da.Fill(ds , "Region");
其中创建了一个新SqlDataAdapter,把生成的SqlCommand赋给数据适配器的SelectCommand属性,然后调用执行存储过程的Fill方法,把返回的所有行插入到Region数据表中(在本例中,它是由运行库生成的)。
数据适配器不仅仅能通过执行命令来选择数据,“保存对数据集的修改”一节会介绍数据适配器的其他功能。





