在ASP.NET 2.0中操作数据之七十:配置数据库连接和(3)

  一个TableAdapter有一个主查询(main query),主查询默认情况下会自动生成INSERT, UPDATE,以及DELETE statements.该主查询的INSERT, UPDATE,DELETE statements在TableAdapter的代码里通过Adapter属性以一个ADO.NET data adapter object(ADO.NET数据适配器对象)的形式来执行.
由于我们的教程使用的SqlClient provider,因此Adapter属性为SqlDataAdapter类型.

TableAdapter的Adapter属性有3个SqlCommand类型的属性,分别用来发出INSERT, UPDATE,DELETE statements:

.InsertCommand
.UpdateCommand
.DeleteCommand

  一个SqlCommand对象负责向数据库发出某个具体的查询,并有相应的属性,比如:CommandText属性包含了要执行的ad-hoc SQL statement或存储过程;Parameters属性是一个SqlParameter对象集。就像我们在第一章《 创建一个数据访问层》探讨的一样,这些command对象可以通过属性窗口进行用户定制.

  除了主查询外,TableAdapter还包含一系列的方法,当调用这些方法时,就向数据库发出具体的命令.主查询的command对象以及其它所有方法使用的command对象都保存在TableAdapter的CommandCollection属性里.

我们花点时间看看Northwind数据集里的ProductsTableAdapter生成的有关这2个属性及其支持的成员变量、方法:

private System.Data.SqlClient.SqlDataAdapter _adapter; private void InitAdapter() { this._adapter = new System.Data.SqlClient.SqlDataAdapter(); ... Code that creates the InsertCommand, UpdateCommand, ... ... and DeleteCommand instances - omitted for brevity ... } private System.Data.SqlClient.SqlDataAdapter Adapter { get { if ((this._adapter == null)) { this.InitAdapter(); } return this._adapter; } } private System.Data.SqlClient.SqlCommand[] _commandCollection; private void InitCommandCollection() { this._commandCollection = new System.Data.SqlClient.SqlCommand[9]; ... Code that creates the command objects for the main query and the ... ... ProductsTableAdapters other eight methods - omitted for brevity ... } protected System.Data.SqlClient.SqlCommand[] CommandCollection { get { if ((this._commandCollection == null)) { this.InitCommandCollection(); } return this._commandCollection; } }

  Adapter 和 CommandCollection属性的代码与Connection属性的代码很相似.这些属性的get模块一开始检测相应的成员变量是否为null,如果是,那么调用一个方法,以创建这个成员变量的一个实例,然后对与command相关的属性进行赋值.

第四步:访问与Command相关的设置

  理想状态下,命令级(command-level)的信息应该封装在数据访问层。当然,我们也可以通过一个部分类来对其进行扩展,就像数据库连接级(connection-level)的设置一样.

  由于TableAdapter只有一个单一的Connection属性,所以那些用于扩展数据库连接级设置的代码是非常直观易懂的.而如果要修改命令级的设置的话要复杂一些,这是因为TableAdapter包含了多个command对象——InsertCommand, UpdateCommand,DeleteCommand, 以及CommandCollection 属性包含的数量不等的command对象.当更新命令级的设置时,这些设置需要告知所有的这些command对象.

  比如,假如在一个TableAdapter里某些查询需要花很长的时间才能执行.当使用该TableAdapter来执行其中的一个查询时,我们可能希望增大command对象的CommandTimeout属性的值.该属性指定了等待命令执行的时间,默认为30秒.

  想要从业务逻辑层来调整CommandTimeout属性的话,可以用我们在第二步里创建的部分类向ProductsDataTable添加一个public类型的方法,如下:(在ProductsTableAdapter.ConnectionAndCommandSettings.cs文件添加):

public void SetCommandTimeout(int timeout) { if (this.Adapter.InsertCommand != null) this.Adapter.InsertCommand.CommandTimeout = timeout; if (this.Adapter.DeleteCommand != null) this.Adapter.DeleteCommand.CommandTimeout = timeout; if (this.Adapter.UpdateCommand != null) this.Adapter.UpdateCommand.CommandTimeout = timeout; for (int i = 0; i < this.CommandCollection.Length; i++) if (this.CommandCollection[i] != null) this.CommandCollection[i].CommandTimeout = timeout; }

  我们可以从BLL层或表现层调用该方法,以设置某个TableAdapter实例发出的所有命令的command timeout值.

  注意:Adapter 和 CommandCollection属性被标记为private,这就意味着只能在TableAdapter内部对其访问.于Connection属性不同,我们不能改变其访问权限配置.因此,如果你想对其进行扩展以便从体系的其它层对其进行访问的话,像上面讨论的那样,我们必须使用部分类来提供一个public类型的方法或属性,对这些标记为private的命令对象进行读写操作.

结语:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwywj.html