程序代码说明:在上述范例的程序代码中,我们利用try catch finally对数据库连接进行异常处理。当无法连接数据库时将抛出异常,并显示出错信息,见catch代码块所示。在此程序中,无论是否发生异常,都可以通过finally区块关闭数据库的连接,从而节省计算机资源,提高了程序的效率和可扩展性。
执行结果:
当然,我们还可以采用一种更加简便的方法来实现上述程序的功能。这就是将SqlConnection对象包含到using区块中,这样程序会自动调用 Dispose()方法释放SqlConnection对象所占用的系统资源,无需再使用SqlConnection对象的Close()方法。
范例程序代码如下:
02 {
03 protected void Page_Load(object sender, EventArgs e)
04 {
05 string connectionString = "server=localhost;database=Northwind;
06 integrated security=SSPI";
07 SqlConnection mySqlConnection = new SqlConnection(connectionString);
08 using (mySqlConnection)
09 {
10 mySqlConnection.Open();
11 lblInfo.Text = "<b>mySqlConnection对象的ConnectionString属性为:<b>" +
12 mySqlConnection.ConnectionString + "<br>";
13 lblInfo.Text += "<b>mySqlConnection对象的ConnectionTimeout属性为<b>" +
14 mySqlConnection.ConnectionTimeout + "<br>";
15 lblInfo.Text += "<b>mySqlConnection对象的Database属性为<b>" +
16 mySqlConnection.Database + "<br>";
17 lblInfo.Text += "<b>mySqlConnection对象的DataSource属性为<b>" +
18 mySqlConnection.DataSource + "<br>";
19 lblInfo.Text += "<b>mySqlConnection对象的PacketSize属性为<b>" +
20 mySqlConnection.PacketSize + "<br>";
21 lblInfo.Text += "<b>mySqlConnection对象的ServerVersion属性为<b>" +
22 mySqlConnection.ServerVersion + "<br>";
23 lblInfo.Text += "<b>mySqlConnection对象的当前状态为<b>"+
24 mySqlConnection.State + "<br>";
25 }
26 lblInfo.Text += "<br><b>关闭连接后的mySqlConnection对象的状态为:</b>";
27 lblInfo.Text += mySqlConnection.State.ToString();
28 }
29 }
程序代码说明:在上述范例的程序代码中,采用using(mySqlConnection)的形式使得代码更加简洁,并且其最大的优点就是无需编写finally区块代码,可以自动关闭与数据库的连接。
连接池
打开与关闭数据库都是比较耗时的。为此,ADO.NET自动将数据库连接存放在连接池中。连接池可以大幅度提高程序的性能和效率,因为我们不必等待建立全新的数据库连接过程,而是直接利用现成的数据库连接。注意,利用Close()方法关闭连接时,并不是实际关闭连接,而是将连接标为未用,放在连接池中,准备下一次复用。
如果在连接字符串中提供相同的细节,即相同的数据库,用户名,密码等等,则可以直接取得并返回池中的连接。然后可以用这个连接访问数据库。
使用SqlConnection对象时,可以在连接字符串中指定max pool size,表示连接池允许的最大连接数(默认为100),也可以指定min pool size表示连接池允许的最小连接数(默认为0)。下面的代码指定了SqlConnection对象的max pool size为10,min pool size为5。
integrated security=SSPI;"+"max pool size=10;min pool size=5");