本文档由李欣蔚(nirvana_li)翻译自http://www.csharp-station.com/,转载请注名出处!
更新日期2006-2-14
Lesson 02: The SqlConnection Object
这节课描述了SqlConnection对象,和如何连接数据库。以下是本课目标
- 知道连接对象用来干什么
- 学习如何初始化SqlConnection对象
- 了解SqlConnection对象如何在应用程序中使用
- 理解有效连接生命周期管理的重要性
引入
当与数据库交互时首先应该创建连接。此连接告诉其余的ADO.NET代码:它将与哪个数据库打交道。它管理所有与特定数据库协议有关联的低级逻辑。这种方式使与数据库连接十分简单,你需要写的代码只是实体化connection对象,打开connection,在完事之后关闭connection。因为ADO.NET以这种方式构造其它的类,某些时候你甚至不需要做太多的工作。
尽管在ADO.NET中使用连接非常简单,你需要理解连接以便在数据存取规则中采用正确的策略。理解连接是非常有价值的。当然,如果在一台机器上有一个单独的客户端应用程序使用单独的数据库,你可能不用关心这个。然而,考虑一个企业级应用程序,全公司的大量用户都存取同样的数据库。每一次连接都代表损耗并且连接的数量都是有限的。再来看一个更加极端的情况,考虑web站点每天要承受成千上万的访问。应用程序保持连接而不让它们断开会对性能和可测量性带来严重的负面影响。
创建SqlConnection对象
SqlConnection是对象,就像C#中其它的对象一样。很多时候,你只需要声明并实例化SqlConnection,如下所示:
SqlConnection conn = new SqlConnection(
"Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");
上面实例化SqlConnection对象使用了带一个string类型参数的构造函数。这个参数叫做连接字符串(connection string)。表1描述了连接字符串的通常部分。
表1.ADO.NET连接字符串包括某些键/值对来指示如何连接数据库。它们包括位置、数据库的名字、和安全认证。
连接字符串参数名 |
描述 |
Data Source |
指明服务器。可以是本地机器,机器域名或者IP地址 |
Initial Catalog |
数据库名字 |
Integrated Security |
设置为SSPI,使连接使用用户的Windows登录 |
User ID |
配置在SQL Server中的用户名 |
Password |
与SQL Server的用户名匹配的密码 |
当你在一个独立的机器上面做开发的时候,集成安全是安全的。然而,你通常希望指明所使用的应用程序的基于SQL Server用户ID的安全许可。下面显示的连接字符串使用了User ID和Password参数:
SqlConnection conn = new SqlConnection(
"Data Source=DatabaseServer;Initial Catalog=Northwind;User ID=YourUserID;Password=YourPassword");
注意Data Source被设置为DatabaseServer来指示你能够指明位于不同机器――跨局域网或者Internet――的数据库。另外,User ID和Password替换调了集成安全参数。
使用SqlConnection
创建SqlConnection对象的需要是使你能够让其它的ADO.NET代码使用数据库。其它的ADO.NET对象,比如SqlCommand和SqlDataAdapter使用connection对象作为参数。在SqlConnection的生命周期中发生的操作顺序如下:
1. 实例化SqlConnection
2. 打开连接
3. 传递连接给其它的ADO.NET对象
4. 使用其它的ADO.NET对象执行数据库操作
5. 关闭连接
我们已经看到如何实例化SqlConnetion。其它的步骤:打开、传递、使用和关闭参见Listing1:
Listing 1. Using a SqlConnection
1 using System; 2 using System.Data; 3 using System.Data.SqlClient; 4 5 /// <summary> 6 /// Demonstrates how to work with SqlConnection objects 7 /// </summary> 8 class SqlConnectionDemo 9 { 10 static void Main() 11 { 12 // 1. Instantiate the connection实例化连接 13 SqlConnection conn = new SqlConnection( 14 "Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI"); 15 16 SqlDataReader rdr = null; 17 18 try 19 { 20 // 2. Open the connection打开连接 21 conn.Open(); 22 23 // 3. Pass the connection to a command object传递连接给command对象 24 SqlCommand cmd = new SqlCommand("select * from Customers", conn); 25 26 // 27 // 4. Use the connection使用连接 28 // 29 30 // get query results得到查询结果 31 rdr = cmd.ExecuteReader(); 32 33 // print the CustomerID of each record打印每条记录的CustomerID 34 while (rdr.Read()) 35 { 36 Console.WriteLine(rdr[0]); 37 } 38 } 39 finally 40 { 41 // close the reader关闭reader 42 if (rdr != null) 43 { 44 rdr.Close(); 45 } 46 47 // 5. Close the connection关闭连接 48 if (conn != null) 49 { 50 conn.Close(); 51 } 52 } 53 } 54 }
如Listing1所示,打开连接需要调用SqlConnection实例conn的Open()方法。如果没有打开连接,任何对连接的操作都会产生异常。所以,你必须在使用连接之前打开它。
在使用连接之前,你必须让ADO.NET代码知道它需要的连接。在Listing1中,我们将SqlCommand对象的第二个参数设置为SqlConnection对象conn。任何对SqlCommand对象的操作将使用此连接。
使用连接的代码是SqlCommand对象,它执行对Customers表的查询。结果集被作为SqlDataReader返回,并且While循环从结果集的每一行中读取第一列,即CustomerID列。我们将在以后的课程中讨论SqlCommand和SqlDataReader对象。现在,你需要着重了解的是这些对象使用SqlConnection对象,所以它们知道要操作哪个数据库。
当你使用完连接对象以后必须关闭它。如果关闭失败则会对应用程序的性能和可测量性造成严重的后果。在Listing1中如何关闭连接有两点:在finally语句块中调用Close()方法,并且在关闭连接之前保证它不为null。
注意我们将ADO.NET代码外覆一层try/finally语句块。在第15课:异常处理中,finally语句块有助于保证某些代码无论是否产生异常的情况下都被执行。因为连接是稀有的系统资源,你需要保证它们在finally语句块中被关闭掉。
另外关闭连接的时候你应该预防的是确保连接对象非空。当实例化连接时出现错误,它将是null,而你确信不会试图关闭一个无效的连接,它应该会产生异常。
这个例子演示了如何通过SqlDataReader使用SqlConnection对象,它需要显式的关闭连接。然而,当使用断开连接模型的时候,并不需要你自己打开并关闭连接。当以后讲到SqlDataAdapter对象的时候我们将会看到它如何使用。
总结
SqlConnection对象让其它的ADO.NET代码知道连接哪一个数据库并且如何连接。它们通过传递一个使用键/值对定义的连接字符串来实例化。使用来管理连接的声明周期是创建、打开、传递、使用和关闭。当你完成了工作后确信适时的关闭连接,避免遇到连接资源泄漏的问题。