Connection对象 访问数据库的第一步是建立连接,只有建立连接,才可能实现 在数据库和应用程序之间移动数据。 ADO提供了连接对象: SqlConnnection:该对象管理与SQL Sever7.0以上版本的连接 OleDBConnection:该对象管理与可通过OLE DB访问的任何 数据库的连接 OdbcConnection – 该对象管理与通过使用连接字符串或 ODBC 数据源名称 (DSN) 创建的数据源的连接。 OracleConnection – 该对象管理与 Oracle 数据库的连接。
Connection对象 SqlConnection 对象特定于SQL Sever, 该对象不必通过OLE DB层,所以速度比OleDBConnection快。 该对象表示与SQL Sever数据源的一个唯一的会话,对于客户端/服务器数据库系统,它相当于到服务器的网络连接。 SqlConnection与SqlDataAdapter和SqlCommand共同使用。
Connection对象 -Connection属性 ConnectionString-执行Open方法时用来连接到数据源的字符串,默认值为空 ConnectionTimeout-尝试建立连接的最长持续时间,超过则产生异常信息,默认值为15秒 Database-打开连接后将要打开的数据库名,默认为空 DataSource-包含数据库的位置和文件,默认为空 PacketSize-用来和SQL Sever通信的网络包的大小,默认为8192字节 SeverVersion-在使用的SQL Sever的版本,默认为空 State-表示Connection当前连接状态的ConnectionState值,默认为关闭 WorkStationID-标识数据库客户端的字符串,或工作站的名称,默认为空 OleDb中没有PacketSize和WorkStationID属性
ConnectionString属性 所有的ConnectionString都有相同的格式,它们由一组关键字和值构成,中间用分号隔开,两端加上单引号或双引号 关键字不分大小写,但是值根据数据源的情况可能分大小写 引号的使用遵循字符串的一般原则,若要包括含有分号、单引号字符或双引号字符的值,则该值必须用双引号括起来。如果该值同时包含分号和双引号字符,则该值可以用单引号括起来。如果该值以双引号字符开始,则还可以使用单引号。相反地,如果该值以单引号开始,则可以使用双引号。如果该值同时包含单引号和双引号字符,则用于将值括起来的引号字符每次出现时,都必须成对出现。
ConnectionString属性 若要在字符串值中包括前导或尾随空格,则该值必须用单引号或双引号括起来。即使将整数、布尔值或枚举值用引号括起来,其周围的任何前导或尾随空格也将被忽略。然而,保留字符串关键字或值内的空格。 如果关键字多次重复,则系统使用最后的状态值 在Connection关闭后,才可以设置ConnectionString;打开Connection时, ConnectionString才生效 当Connection检测到无效或不支持的属性,将产生异常信息(OleDbException或SqlException)
ConnectionString属性 下表列出了ConnectionString 中的关键字值的有效名称
ConnectionString属性 SqlConnection ocon; string strcon; ocon=new SqlConnection(); strcon="Data Source=(local);"; strcon+="Initial Catalog=Northwind;"; strcon+="Integrated Security=yes/true/sspi;"; ocon.ConnectionString=strcon; ocon.Open(); ocon.Close();
SqlConnection.State 属性 允许的状态更改包括: 使用连接对象的 Open 方法从 Closed 更改为 Open。 使用连接对象的 Close 方法或 Dispose 方法从 Open 更改为 Closed。 例:创建一个 SqlConnection并显示它的State属性 public void CreateSqlConnection() { string myConnectString ="Persist Security Info=False;Integrated Security=SSPI; database=northwind;server=mySQLServer"; SqlConnection myConnection = new SqlConnection(myConnectString); myConnection.Open(); MessageBox.Show("ServerVersion: " + myConnection.ServerVersion+ "\nState: " + myConnection.State.ToString()); myConnection.Close(); }
SqlConnection 构造函数 public SqlConnection(); public SqlConnection(string); String-给定包含连接字符串的字符串 例: string myConnectString = "Integrated Security=SSPI; database=northwind; server=mySQLServer;Connect Timeout=30"; SqlConnection myConnection = new SqlConnection(myConnectString); myConnection.Open();
Connection方法 常用方法: BeginTransaction 已重载。开始数据库事务。 ChangeDatabase 为打开的 SqlConnection 更改当前数据库。 Open 使用 ConnectionString所指定的属性设置打开数据库连接。 Close 关闭与数据库的连接。这是关闭任何打开连接的首选方法。 CreateCommand 创建并返回一个与 SqlConnection关联的 SqlCommand对象。
例 private void Connection_Click(object sender, System.EventArgs e) { SqlConnection ocon; string strcon; try ocon=new SqlConnection(); strcon="Data Source=(local);"; strcon+="database=Northwind;"; //strcon+="Initial Catalog=Northwind;"; 如果设置包括“Initial Catalog= northwind”的连接字符串,则不会再将 Database 属性设置为 northwind。(该连接字符串的 Initial Catalog 值与 Database 属性对应。) ocon.ConnectionString=strcon; strcon+="Integrated Security=sspi;"; //strcon+="User ID=sa;";strcon+="Password=;"; ocon.Open(); MessageBox.Show(ocon.State.ToString(),"connection_Click()"); ocon.Close(); } catch(SqlException oExcept) MessageBox.Show(oExcept.Message,"connection_Click()");
Connection方法 公共事件: Disposed (从 Component 继承) InfoMessage 当 SQL Server 返回一个警告或信息性消息时发生。 StateChange 当连接状态更改时发生。 Disposed 事件处理程序接收一个 StateChangeEventArgs类型的参数,它包含与此事件相关的数据。下列 StateChangeEventArgs 属性提供特定于此事件的信息。 CurrentState-获取连接的新状态。在激发该事件时,连接对象将处于新状态。 OriginalState-获取连接的原始状态。 备注 每当State从关闭转为打开,或从打开转为关闭时,都会激发 StateChange 事件。在 SqlConnection转换之后会立即激发 StateChange。 如果事件处理程序从 StateChange 事件内引发了某个异常,该异常将传播到 Open或 Close方法的调用者。 除非显式调用 Close 或 Dispose,否则不会引发 StateChange 事件。
例 private void Connection_Click(object sender, System.EventArgs e) { SqlConnection ocon; string strcon; try ocon=new SqlConnection(); ocon.StateChange += new System.Data.StateChangeEventHandler(SqlDbConnection_StateChange); strcon="Data Source=(local);"+"database=Northwind; " +"Integrated Security=sspi;"; ocon.ConnectionString=strcon; ocon.Open(); ocon.Close(); } catch(SqlException oExcept) MessageBox.Show(oExcept.Message,"connection_Click()"); private void SqlDbConnection_StateChange (object sender, StateChangeEventArgs e) string theMessage= "The Connection State is changing from " + e.OriginalState.ToString() + " to " + e.CurrentState.ToString(); MessageBox.Show(theMessage);
连接池 建立池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET Framework 数据提供程序自动为 ADO.NET 客户端应用程序提供连接池 应用程序经常有多个用户执行相同类型的数据库访问。例如,在 ASP.NET Web 应用程序中可能有许多用户正在查询相同的数据库以获取相同数据。在这些情况下,可以通过使应用程序共享到数据源的连接来提高应用程序的性能。否则,让每个用户打开和关闭单独的连接的开销会对应用程序性能产生不利影响。 如果使用的是 OleDbConnection、OdbcConnection 或 OracleConnection 类,则连接池将由提供程序自动处理,所以不必自己进行管理。 如果使用的是 SqlConnection 类,则连接池被隐式管理,但也提供选项允许自己管理池。
连接池是一个进程,该进程保存连接并使其处于活动 状态,使连接可以被重复使用 连接池的工作过程 Pooling 参数为 true 时(默认),连接池启用 两个连接的连接字符串相同时 ,被放置在一个连接池中 两个连接的连接字符串不同时,被放置在不同的连接池中 连接被 Close 时,连接被放置在连接池中以备重用 连接被 Dispose 时,连接被彻底删除 连接池最后一个连接被 Close 时,连接池被删除
池的创建和分配 当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。 在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。 SqlConnection conn = new SqlConnection(); conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind"; conn.Open(); // 池 A 被创建. conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs"; conn.Open(); // 池 B被创建,由于连接的ConnectionStrings不同. conn.Open(); // ConnectionString与池A匹配. 连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。
连接的添加 连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。 当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。 如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,连接池管理程序通过重新分配连接来满足这些请求。对 Connection 调用 Close 或 Dispose 时,连接被释放回池中。 警告 建议使用完 Connection 后始终将其关闭,以便连接可以返回到池中。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。不是显式关闭的连接可能不会添加或返回到池中。
使用连接字符串关键字控制连接池 SqlConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。 下表描述了可用于调整连接池行为的 ConnectionString 值。 名称 说明 Connection Lifetime 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间 隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。 在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负 载平衡。 如果值为零 (0),则将使池连接具有最大的超时期限。默认0 Connection Reset 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返过程, 但必须注意的是连接状态(如数据库上下文)不会被重置。默认'true‘ Enlist 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前 事务上下文中登记连接。默认'true‘ Max Pool Size 池中允许的最大连接数。默认100 Min Pool Size 池中维护的最小连接数。默认0 Pooling 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添 加到相应的池中。默认'true‘
例:阐释如何构造到数据源的连接池。在此示例中,池是在连接字符串中建立起来并由 SqlConnection 自动管理的 using System; using System.Data.SqlClient; public class connectionpooling { public static void Main() connectionpooling myconnectionpooling = new connectionpooling(); myconnectionpooling.Run(); } public void Run() try String connString = "server=(local)\\NetSDK; Trusted_Connection=yes; database=northwind;" + "connection reset=false;" + "connection lifetime=5;" + "min pool size=1;" + "max pool size=50"; // 在连接字符串的定义中: // 注意: 包含了池, 可以自动产生池。Pooling的默认值为“true” SqlConnection myConnection1 = new SqlConnection(connString); SqlConnection myConnection2 = new SqlConnection(connString); SqlConnection myConnection3 = new SqlConnection(connString);
Console.WriteLine (“打开两个连接。”); myConnection1.Open(); myConnection2.Open(); //打开两个连接. Console.WriteLine (“将两个连接都返回到池中。”); myConnection1.Close(); myConnection2.Close(); // 池中两个连接的connection string 匹配,将两个连接都返回到池中 Console.WriteLine (“从池中打开一个连接。”); myConnection1.Open(); //从池中打开一个连接 Console.WriteLine (“从池中打开第二个连接。”); myConnection2.Open(); //从池中打开第二个连接 Console.WriteLine (“打开第三个连接。”); myConnection3.Open(); //打开第三个连接 Console.WriteLine (“将所有三个连接都返回到池中。”); myConnection3.Close(); //将所有三个连接都返回到池中 } catch (Exception e) { Console.WriteLine(e.ToString()); // 显示错误. } }