(六)数据适配器对象——以编程方式访问数据库
1、 配置数据适配器
初始配置有两个要求:
1) 可以获取数据的Select语句,或SqlCommand(如果使用Select语句,它将用于在内部生成SqlCommand);
2) 连接字符串,SqlConnection对象(如果使用连接字符串,它将用于在内部生成SqlConnection对象,而如果使用有连接的SqlCommand,将使用该连接)。
例如:
SqlConnection conn = new SqlConnection(ConifgurationManager
.ConnectionStrings[“MyConnectionString”].ConnectionString);
SqlCommand cmd = new SqlCommand ( “ SELECT * FROM MyTable ” , conn);
SqlDataAdapter adapter = new SqlDataAdapter( cmd );
或者:
SqlDataAdapter adapter = new SqlDataAdapter(“ SELECT * FROM MyTable ”,
ConifgurationManager.ConnectionStrings[“MyConnectionString”].ConnectionString);
配置后,可以用Fill()和FillSchema()方法来填充DataTable中的数据和架构信息——DataTable可以是一个独立的实例,也可以是DataSet中的对象。
为了能够通过SqlDataAdapter修改数据,还要设置3个属性——DeleteCommand、InsertCommand和UpdateCommand。可手工创建这些命令,也可以使用命令生成器SqlCommandBuilder来创建,SqlCommandBuilder builder = new SqlCommandBuilder(adapter)。
2、 提取数据库数据
配置数据适配器后,只要调用它的Fill()方法,并传递要填充数据的DataTable引用即可提取:
DataTable dt = new DataTable();
adapter.Fill( dt );
此方法传输数据时,不传输架构信息。解决此问题的方法有二。
一是,使用数据适配器来推断数据库中的架构信息。如果使用SqlCommandBuilder来生成命令,数据适配器已经获得了架构信息,因此可以使用这些架构信息来配置DataTable。为此,可使用FillSchema()方法。例如:
DataTable dataTable = new DataTable ();
adapter.FillSchema ( dataTable , SchemaType.Mapped );
adapter.Fill ( dataTable );
二是,使用Fill ()方法,以已经具有与数据阅读器获得的数据相匹配的架构的DataTable对象为参数。这样不必自己创建架构。
3、 修改数据库数据
将数据加载到DataTable对象中后,可以读取和操这些数据。然而,使用数据适配器将数据的修改提交给数据库后,这些修改才生效。这个操作很简单:adapter.Update ( dataTable);
使用数据适配器的GetChanges()方法可获得要执行的修改,而AcceptChanges()则接受修改。
4、 定制数据适配器的行为
大部分定制都可以通过属性完成。
表映射:表映射决定数据库中的数据表如果映射到DataTable对象中的数据列。
要控制表映射,可用SqlDataAdapter.TableMappings属性。每个DataTableMapping对象都有3个需要配置:
1) SourceTable : 数据库中的表名;
2) DataSetTable : 在DataSet的DataTable对象集合中标识表的表名;
3) ColumnMappings : ColumnMapping对象的集合,每个ColumnMapping对象都将数据库中的一列映射到DataTable中的一列。
每个ColumnMapping对象都有两个属性需要配置:
1) SourceColumn : 数据库中的列名;
2) DataSetColumn : DataTable 中的列名。
要设置表映射,需要在类型为DataTableMapping的SqlDataAdapter.ColumnMapping属性中添加一个新元素,例如:
adapter.TableMappings.Add ( “ SourceTableName ” , “ DataSetTableName”); ,然后使用同样的方式来添加列映射:
adapter.TableMappings [ “ SourceTableName ” ].Add (
“ SourceColumn1Name ”, “ DataSetColumn1Name ”);
adapter.TableMappings [ “ SourceTableName ” ].Add (
“ SourceColumn1Name ”, “ DataSetColumn1Name ”);