手机版

ASP.NET 2.0中的操作数据70:配置数据库连接和命令级别设置

时间:2021-10-30 来源:互联网 编辑:宝哥软件园 浏览:

导言:

在本系列中,我们使用类型化数据集来构建数据访问层。正如第一章所讨论的,类型化数据集的数据表被用作存储数据的“仓库”,而TableAdapters被用作连接数据库以检索和修改数据的通道。TableAdapters封装了处理数据库的许多复杂细节,这让我们摆脱了编写代码来连接数据库、发布名称和将数据填充到DataTable中的痛苦。

但是,在某些情况下,我们需要深入探索TableAdapter并直接编写代码来处理ADO.NET对象。在第61章,《在事务里对数据库修改进行封装》中,我们向TableAdapter添加了几个方法来启动、提交和回滚added事务。这些方法都使用内部和手动创建的SqlTransaction对象来为TableAdapter的SqlCommand对象赋值。

在本文中,我们将研究如何访问TableAdapter的“数据库连接”和“数据库命令”级别的设置。具体来说,我们将向ProductsTableAdapter添加函数,以访问“连接字符串”和“命令超时”的设置。

与ADO.NET一起处理数据。

微软。NET Framework包含许多用于处理数据的专用类。这些类是用系统创建的。数据命名空间,包括ADO.NET类,以及ADO.NET名下的一些类需要依赖特定的数据提供者才能工作。你可以想象在ADO.NET类和数据存储之间,有一个数据提供者作为传输信息的通信通道。数据提供者包括OleDb、ODBC和其他专门设计用于连接特定数据库系统的数据提供者。例如,我们不能使用OleDb连接到Microsoft SQL Server数据库,但是SqlClient可以,因为它是专门为连接到SQL Server而设计和优化的。

编程访问数据时,通常使用以下模式:

1.创建新的数据库连接2。发出命令3。使用SELECT查询返回记录。

以上三个步骤都有单独的above类要执行。例如,SqlConnection类用于连接数据库;要发出插入、更新、删除或选择命令,请使用SqlCommand类类。

除了第61章,《在事务里对数据库修改进行封装》,我们没有自己编写任何ADO.NET代码,因为TableAdapters自动生成的代码包含了一些必要的功能:连接数据库、发出命令、检索数据、填充DataTables。但是有时我们必须自己定制这些设置。在接下来的几个步骤中,我们将探索TableAdapters中使用的ADO.NET对象。

步骤1:检查连接属性。

每个TableAdapter类都有一个用于指定数据库连接信息的连接属性。此属性的数据类型和ConnectionString的值取决于TableAdapter安装向导所做的配置。我们仍然记得,当TableAdapter被添加到类型化数据集时,向导要求我们指定数据源(参见图1)。在下拉列表中,列出了web.config文件指定的数据库和服务器资源管理器的“数据连接”中的数据库。如果要连接的数据库没有出现在下拉列表中,请单击“新建连接”按钮提供必要的连接信息。

//files.jb51.net/file_images/article/201605/2016051910520057.png

图1:第1步,共1步:TableAdapter安装向导。

让我们花一些时间来看看TableAdapter的Connection属性的代码,就像第1章《创建一个数据访问层》中讨论的那样,我们可以在Class View窗口中查看自动生成的TableAdapter代码,转到相应的类,然后双击成员名称。

打开“视图”菜单,选择“类视图”(或按Ctrl+Shift+C)。在“类视图”窗口的上部,选择NorthwindTableAdapters命名空间,然后选择ProductsTableAdapter类。这将在下部显示ProductsTableAdapter的成员,如图2所示。双击“连接”属性查看代码。

//files.jb51.net/file_images/article/201605/2016051910520058.png

图2:双击连接查看自动生成的代码。

TableAdapter的Connection属性和其他连接相关代码如下:

私人系统数据。sqlclient。sqlconnection _ connectionprivate void IntConnection(){ this ._连接=新系统数据。sqlclient。sqlconnection();这个。_连接。连接字符串=配置管理器连接字符串[' NORTHWNDConnectionString '].ConnectionString}内部系统数据。sqlclient。sqlconnection Connection { get { if(this ._ connection==null)){ 0这init connection();}退回这个。_连接;}设置{这个_连接=值;如果((这个。适配器。插入命令!=null)){ 0这。适配器。插入命令。连接=值;} if(这个。适配器。删除命令!=null)){ 0这。适配器。删除命令。连接=值;} if(这个。适配器。更新命令!=null)){ 0这。适配器。更新命令。连接=值;} for(int I=0;(我这个。命令集合长度);i=(i 1)) { if ((this .CommandCollection[i]!=null)) {((系统数据。SqlClient.SqlCommand()这命令集合.连接=值;} } }}当对表适配器类类进行"实例化"(实例化)时,成员变量_连接的值等同为零.当访问关系属性时,首先检查是否已经对成员变量_连接实例化,如果没有的话就调用InitConnection方法,该方法对_连接进行实例化,然后用表适配器设置向导指定的连接字符串对其赋值。

同样可以用关系属性对一个SqlConnection对象赋值,这样的话就可以将这个新的SqlConnection对象与表适配器的对象对象联系起来。

第二步:访问"数据库连接"级的设置

数据库连接信息封装在表适配器内部,很难从应用程序的其它层对其进行访问。然而,在某些时候,某人查询、用户或ASP .网页面需要对表适配器的连接信息进行访问或定制。

让我们对北风数据集的ProductsTableAdapter进行扩展,以包含一个连接字符串属性,以便于在业务逻辑层对表适配器用到的连接字符串进行读取和更改。

注意:一个连接字符串是这样的一个字符串,它指定了数据库连接信息。比如,提供者提供商、数据库的位置、身份验证,以及其它与数据库相关的设置。更多详情请参考网站ConnectionStrings.com

就像在第一章《创建一个数据访问层》 里讨论过的一样,类型化的资料组自动生成的类可以通过使用部分类(部分类别)来进行扩充。首先,在~/App_Code/DAL文件夹里新建一个名为连接和命令设置的文件夹。

//files.jb51.net/file_images/article/201605/2016051910520059.png

图3:添加一个名为连接和命令设置的文件夹

在里面添加一个ProductsTableAdapter .connectionandcommandsettings。铯文件,键入如下的代码:

使用系统;使用系统。数据;使用系统。配置;使用系统网络.使用系统。网络安全;使用系统网络。用户界面使用系统。网络控件;使用系统。网页组件;使用系统网络。UI。HtmlControls命名空间NorthwindTableAdapters{公共分部类ProductsTableAdapter {公共字符串connectionString { get { return this } .连接字符串;}设置{这个。连接。连接字符串=值;} } }}该局部类为ProductsTableAdapter类类添加了一个公众的类型的,名为连接字符串的属性。该属性允许在任何层对表适配器用到的连接字符串进行读取和更改。

当创建并保存该局部类后,打开ProductsBLL类类。打开其中的一个方法,键入适配器,再输入其范围内的一个关键字以打开智能感知,你应该可以看到这个新添加的的连接字符串属性出现在智能感知里,这就表明了我们可以在基地址定位连接层通过编程来读取或更改其值。

访问整个关系对象

本地类只扩展了连接对象的许多属性中的一个:连接字符串。如果要访问TableAdapter范围之外的整个连接对象,可以更改connection属性的保护级别。正如我们在第一步中检查的那样,TableAdapter的Connection属性被标记为internal,这意味着它只能在同一个类中访问。但是,我们可以通过TableAdapter的ConnectionModifier属性来更改它的访问范围。

打开北风数据集,右键单击ProductsTableAdatper并打开属性窗口,您将看到ConnectionModifier被设置为默认的Assembly。为了访问数据集之外的Connection属性,我们将其更改为Public。

//files.jb51.net/file_images/article/201605/2016051910520060.png

图4:您可以通过ConnectionModifier属性修改Connection属性的访问范围。

保存并返回到ProductsBLL类类,然后像以前一样在现有方法中键入Adapter,然后在其范围内输入一个关键字以打开intellisense。您还应该看到一个Connection属性,这意味着我们可以在业务逻辑层中以编程方式读取或分配连接设置。

步骤3:调查与命令相关的属性。

TableAdapter有一个主查询,默认情况下会自动生成INSERT、UPDATE和DELETE语句。在TableAdapter代码中,DELETE语句以ADO.NET数据适配器对象(ado)的形式执行。net数据适配器对象)。因为我们的教程使用了SqlClient提供程序,所以适配器属性属于SqlDataAdapter类型。

TableAdapter的Adapter属性有三个SqlCommand类型的属性,分别用于发出insert、update和delete语句:

. insertcommand . updatecommand . delete command

一个SqlCommand对象负责向数据库发送特定的查询,并具有相应的属性,例如CommandText属性包含要执行的即席SQL语句或存储过程;参数属性是一组SqlParameter对象。正如我们在第一章《创建一个数据访问层》中讨论的,用户可以通过属性窗口自定义这些命令对象。

除了主查询,TableAdapter还包含一系列方法,当调用这些方法时,特定的命令会被发送到数据库。主查询的命令对象和所有其他方法都存储在TableAdapter的CommandCollection属性中。

让我们花点时间来看看由Northwind数据集中的ProductsTableAdapter生成的两个属性及其支持的成员变量和方法:

私人系统。data . sqlclient . sqldatadapter _ adapter;private void InitAdapter() { this。_适配器=新系统。data . sqlclient . sqldatadapter();创建插入命令、更新命令,和DeleteCommand实例-为简洁起见省略.}私有系统。data . sqlclient . sqldatadapter { get { if(this。_adapter==null)) {这。InitAdapter();}退回这个。_适配器;} }专用系统。data . sqlclient . sqlcommand[]_ command collection;private void InitCommandCollection(){ this。_commandCollection=新系统。data . sqlclient . sqlcommand[9];为主查询和创建命令对象的代码.ProductsTableAdapters其他八种方法-为简洁起见省略.}受保护的系统。data . sqlclient . sqlcommand[]command collection { get { if(this。_commandCollection==null)) {这。InitCommandCollection();}退回这个。_ commandCollection}}Adapter和CommandCollection属性的代码与Connection属性的代码相似。这些属性的get模块最初检测对应的成员变量是否为null,如果是,则调用一个方法来创建该成员变量的实例,然后为与command相关的属性赋值。

步骤4:访问与命令相关的设置。

理想情况下,命令级信息应该封装在数据访问层中。当然,我们也可以通过一个分部类来扩展它,就像数据库连接级的设置一样。

因为TableAdapter只有一个Connection属性,所以用来扩展数据库连接级别设置的代码非常直观,容易理解。但是,如果要修改命令级别的设置,就比较复杂了,因为TableAdapter包含多个命令对象——INSERT COMMAND、UPDATE COMMAND、DeleteCommand和CommandCollection属性包含不同数量的命令对象。在命令级别更新设置时,这些设置需要通知所有这些命令对象。

例如,假设TableAdapter中的一些查询需要很长时间才能执行。当使用这个TableAdapter执行其中一个查询时,我们可能希望增加命令对象的CommandTimeout属性。此属性指定等待命令执行的时间,默认值为30秒。

如果要从业务逻辑层调整CommandTimeout属性,可以通过使用我们在第二步中创建的一些类向ProductsDataTable添加一个公共方法,如下所示:(在Products TableAdapter中添加。connectionandcommandsettings . cs文件):

public void SetCommandTimeout(int time out){ if(this。适配器。插入命令!=null)这个。适配器。InsertCommand.CommandTimeout=超时;如果(这个。适配器。删除命令!=null)这个。适配器。DeleteCommand.CommandTimeout=超时;如果(这个。适配器。更新命令!=null)这个。适配器。UpdateCommand.CommandTimeout=超时;for(int I=0;我喜欢这个。命令集合。长度;I)如果(这个。CommandCollection[i]!=null)这个。CommandCollection[i]。CommandTimeout=超时;}我们可以从BLL层或表示层调用这个方法来设置TableAdapter实例发出的所有命令的命令超时值。

注意:适配器和CommandCollection属性被标记为私有,这意味着它们只能在TableAdapter内部访问。与Connection属性不同,我们不能更改其访问权限配置。因此,如果您想扩展它以从系统的其他层访问它,如上所述,我们必须使用一些类来提供一个公共类型的方法或属性来读写这些标记为私有的命令对象。

结论:

TableAdapters封装了数据访问等细节,因此当我们使用TableAdapters时,我们不需要关心手写的ADO.NET代码来连接数据库、发出命令以及用检索到的数据填充DataTable,因为它已经自动生成了这些代码。

但是,在某些情况下,我们需要自定义这些ADO.NET详细信息,例如更改连接字符串或默认命令超时和连接超时值。TableAdapter自动生成连接、适配器和命令集合属性。但是,默认情况下,这些属性要么标记为内部属性,要么标记为私有属性。我们可以通过使用一些类以及在一些类中使用标记为公共的方法或属性来扩展内部信息。此外,我们可以通过TableAdapter的ConnectionModifier属性来更改其Connection属性的访问权限。

编程快乐!

作者简介

Scott Mitchell,本系列教程的作者,也是关于ASP/ASP的六本书的作者。NET,是4GuysFromRolla.com的创始人,自1998年以来一直使用微软的网络技术。你可以点击查看所有教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望能帮助你学习ASP.NET。

版权声明:ASP.NET 2.0中的操作数据70:配置数据库连接和命令级别设置是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。