4_连接到数据源

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章连接到数据源本章你将考察ADO.NET内连接到数据库的方法。你将学会如何建立、打开和关闭连接ADO.NET为你提供了一个合适的连接对象以便能连接到数据源,这作为数据源特异性的数据提供程序的一部分。因而针对SQLServer的.NET框架数据源提供程序包含了一个名为SqlConnection的类,可以让你建立到微软SQLServer数据库的连接。1.连接的能力无论你连接到何种数据源,在具体的连接实现之间都会有一些通用性。显而易见,你至少需要建立连接或打开连接。要打开连接,你需要指定打开连接的信息,比如服务器名称、用户ID、密码等。由于每个目标数据源可能需要一组不同的信息让ADO.NET能连接到该数据源,所以选择了一种通过连接串来指定这些连接设定的灵活机制。连接串以字符串的键-值对形式表示了建立连接所需要最基本的信息。在连接串中各种键-值对也可以定义为特定的可配置的参数,用于指定连接的行为。因此一个典型的连接字符串具有如下格式:“parametername1=parametervalue1;parametername2=parametervalue2…;”由于能打开连接,因此能关闭一个打开的连接就很有意义。此外,对于任何要与数据源进行通信而言,你可能首先需要检查到数据源的连接是否已经打开而且可用。你也应当能获取连接的当前状态。因此,在能够建立到数据库连接的类上至少要有两种方法:Open和Close,以及一个State属性。1.1创建连接对象ADO.NET把建立到给数据库的连接的功能封装在一个典型的连接中:SqlConnectiontestConnection=newSqlConnection();因为没有告诉连接对象要连接到哪个数据库,要使用哪种访问身份等,所以还需要使用SqlConnection对象的ConnectionString属性来指定这些参数。SqlConnectiontestConnection=newSqlConnection();stringtestConnectionString=DataSource=(local);InitialCatalog=Test;IntegratedSecurity=SSPI;testConnection.ConnectionString=testConnectionString;这段代码准备了一个使用Windows身份验证的、连接到本机SQLServer上的、连接到名为Test的数据库的连接对象。也可以使用SqlConnection类的一个构造函数来创建一个立即可用的SqlConnection对象。SqlConnectiontestConnection=newSqlConnection(DataSource=(local);InitialCatalog=Test;IntegratedSecurity=SSPI);注意:连接对象与数据库的物理连接并不一样。从本章后面可以看出,如果你正在使用连接池,这对于很多提供程序而言是默认打开的,那么调用连接对象的Open方法会让你使用一个已经打开但是没有使用的物理连接,或者如果没有足够的已经存在的物理连接,那么就打开一个全新的连接。staticvoidMain(string[]args){SqlConnectiontestConnection=newSqlConnection(DataSource=(local);InitialCatalog=Test;IntegratedSecurity=True);try{testConnection.Open();if(testConnection.State==ConnectionState.Open){Console.WriteLine(Successfullyopenedaconnection);}}catch(Exception){if(testConnection.State!=ConnectionState.Open){Console.WriteLine(Failedtoopenaconnection);}}finally{if(testConnection.State==ConnectionState.Open){testConnection.Close();}}testConnection.Dispose();}}1.2生成提供程序特定的连接串如果没有一个简易的、直观的方法来构建连接串,对于任何数据提供程序的连接对象而言,很容易忽略很多配置功能。ADO.NET2.0试图通过提供DbConnectionStringBuilder类来解决这个问题。DbConnectionStringBuilder对象将各种连接串的候选值类型化,以避免细微的编程错误,也使得连接串信息变得更好管理。每个.NET数据提供程序必须包含一个从DbConnectionStringBuilder继承而来的类,以便于连接字符串的构建。SqlClient也有一个SqlConnectionStringBuilder。staticvoidMain(string[]args){SqlConnectionStringBuilderconnstrBuilder=newSqlConnectionStringBuilder();connstrBuilder.DataSource=(local);connstrBuilder.InitialCatalog=Test;connstrBuilder.IntegratedSecurity=true;using(SqlConnectiontestConnection=newSqlConnection(connstrBuilder.ToString())){try{testConnection.Open();if(testConnection.State==ConnectionState.Open){Console.WriteLine(Connectionsuccessfullyopened);Console.WriteLine(Connectionstringused:+testConnection.ConnectionString);}}catch(Exception){if(testConnection.State!=ConnectionState.Open){Console.WriteLine(Connectionopenfailed);Console.WriteLine(Connectionstringused:+testConnection.ConnectionString);}}}使用SqlConnectionStringBuilder类你可以很轻松地创建连接串,但是这要求你记住各种ConnectionString的键-值对。你应当仔细查看SqlConnectionBuilderObject的各种属性,并且了解通过使用连接串可以与数据源通信的各个配置参数。1.3编写连接串的简便方法对于每个数据提供程序,微软的统一数据连接(.udl)文件为大家提供了另一种创建并记住复杂连接串的方便方法。1.创建一个新的文本文件,命名为**.udl。2.双击文件会弹出数据连接属性对话框。3.打开“提供程序”选项卡,指定必要的属性(如果有的话)。**.udl文件现在就可以在写字板中打开来看了。***增强连接串的安全性2公共行为:IDbConnection任何连接对象的公共行为,比如打开连接、关闭连接以及检测连接的当前状态,都是通过是System.Data.IDbConnection接口来强制实现的。ADO.NET对象可视为一个与外部资源进行交换的东西。连接对象能操作的东西不仅仅是外部资源,而且它是一个具有性能开销的资源,因为连接到数据源是应用程序可能遇到的开销最大的操作之一。基于这个原因连接对象实现IDisposable是很重要的。IDisposable是.NET中标准接口,其定义了名为Dispose的方法,该方法用于释放所分配的资源,特别是非托管资源。BeginTransaction:为了确保数据完整性,大多数现代数据库都支持事务的概念。事务定义了原子性操作,它是要么都执行要么都不执行的方式操作的。BeginTransaction是在数据上开始执行事务时最常用的功能。ChangDatabase:当连接到数据服务器时,一个服务器上可能有很多个数据库。ChangDatabase函数可以让你在同一服务器上变更数据库。调用ChangDatabase比使用带有打开连接池的全新对象的开销更小。当然这个优势仅限于SQLSever,因为SQLServer使用的是两步骤连接。第一步是连接到服务器,第二部是连接到所请求的库。下面是IdbConnection要求.NET数据库提供程序编写者必须要实现的各种方法列表:Open:是打开到数据库的连接,并且让连接变为可用。尽可能晚地打开连接并且尽可能早地关闭连接是很重要的。Close:从字面上说Close会关闭一个已经打开的连到数据库上的连接。虽然Close和Dispose都能实现连接的池化,但是一个关闭的连接可以重新打开,一个被弃置的连接却不能重新打开了。CreateCommand:与数据库的交互是用Command对象来实现的。Command对象可以让你通过各种参数指定命令文本。对于要执行的命令来说,它必须知道要访问的是什么数据库。连接对象的上CreateCommand方法可以创建一个Command对象,在执行命令时,这个Command对象将会在创建它的连接对象上执行。如下是IdbConnection要求你必须实现的各种属性列表:ConnectionString:该属性用于指定连接对象所需要的各种参数,以便能成功打开一个到数据库的连接。ConnectionTimeOut:可以当你指定在连接对象放弃连接并且抛出错误前的秒数。0表示超时无限,应当避免使用。Database:该属性指定了当前数据库的名称或连接打开后要用到的数据库的名称。State:该属性允许连接对象指定其当前状态。最常用的状态是ConnectionState.Open和Connection.Close。3.公共逻辑:DbConnectionDbConnection类被标记为abstract/MustInherit,这就意味着你不能直接实例化这个类。特定的数据提供程序的连接类都必须从这个类继承而来。DbConnection类实现了IDbConnection接口。4.高要求的应用程序在简单的单用户应用程序中,长时间地保持连接打开状态可能不会对数据库的性能有什么太大的影响,但是在高要求的应用程序(拥有众多实时用户的网站或高度并发的系统)可能会出现不同问题。通过保持少数几个立即可用的已打开的物理网络连接,把当前不使用的物理网络连接传递给请求打开数据库连接(比如SqlConnection)的请求。本质上,这种基于多个DbConnection对象多路传输的几个打开的物理连接通过所谓连接池,来创建一个并不需要利用太多资源的高度可用的数据库外观层。根据应用程序不同需要,各种数据访问架构甚至可能会增加或缩小这个可用的连接池。5.连接池在需要高度并发/高度可用应用程序中,大部分时间里用户可能会保持一个打开的连接,而且不是积极地使用该连接,因为用户在使用应用程序的其他功能,意识到这点很重要。应用程序可以把其宝贵的资源——一个打开的连接——从本质上切割成时间片段,并且在多个用户之间来池化它。使用ADO.NET的连接池实际上是很简单的,因为你并不需要做什么而仅用默认设置就能使用连接池;相反,如果你不使用连接池,则需要显式地关闭它。例如:对于SqlClient来说,如果你不需要池化连接,就可以简单地把如下键-值对添加到连接串:Pooling=false;实际情况可能稍微复杂一些,因为ADO.NET是基于应用程序的加载来做出判断的。当为true时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。'true'Pool

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功