ASP.NET2.0
连接
SQL Server
数据库详解
本文将详细介绍如何使用
Connection
对象连接数据库。对于不同的
.NET
数据提供者,
ADO.NET
采用不同的
Connection
对象连接数据库。这些
Connection
对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。
Connection
类有四种:
SqlConnection
,
OleDbConnection
,
OdbcConnection
和
OracleConnection
。
SqlConnection
类的对象连接
SQL Server
数据库;
OracleConnection
类的对象连接
Oracle
数据库;
OleDbConnection
类的对象连接支持
OLE DB
的数据库,如
Access
;而
OdbcConnection
类的对象连接任何支持
ODBC
的数据库。与数据库的所有通讯最终都是通过
Connection
对象来完成的。
SqlConnection
类
Connection
用于与数据库
“
对话
”
,并由特定提供程序的类(如
SqlConnection
)表示。尽管
SqlConnection
类是针对
Sql Server
的,但是这个类的许多属性、方法与事件和
OleDbConnection
及
OdbcConnection
等类相似。本章将重点讲解
SqlConnection
特定的属性与方法,其他的
Connection
类你可以参考相应的帮助文档。
注意:使用不同的
Connection
对象需要导入不同的命名空间。
OleDbConnection
的命名空间为
System.Data.OleDb
。
SqlConnection
的命名空间为
System.Data.SqlClient
。
OdbcConnection
的命名空间为
System.Data.Odbc
。
OracleConnection
的命名空间为
System.Data.OracleClinet
。
SqlConnection
属性:
属性
|
说明
|
ConnectionString
|
其返回类型为
string,
获取或设置用于打开
SQL Server
数据库的字符串。
|
ConnectionTimeOut
|
其返回类型为
int,
获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。
|
Database
|
其返回类型为
string,
获取当前数据库或连接打开后要使用的数据库的名称。
|
DataSource
|
其返回类型为
string,
获取要连接的
SQL Server
实例的名称。
|
State
|
其返回类型为
ConnectionState,
取得当前的连接状态:
Broken
、
Closed
、
Connecting
、
Fetching
或
Open
。
|
ServerVersion
|
其返回类型为
string,
获取包含客户端连接的
SQL Server
实例的版本的字符串。
|
PacketSize
|
获取用来与
SQL Server
的实例通信的网络数据包的大小(以字节为单位)。这个属性只适用于
SqlConnection
类型
|
SqlConnection
方法:
方法
|
说明
|
Close()
|
其返回类型为
void,
关闭与数据库的连接。
|
CreateCommand()
|
其返回类型为
SqlCommand,
创建并返回一个与
SqlConnection
关联的
SqlCommand
对象。
|
Open()
|
其返回类型为
void,
用连接字符串属性指定的属性打开数据库连接
|
SqlConnection
事件:
事件
|
说明
|
StateChange
|
当事件状态更改时发生。
(从
DbConnection
继承。)
|
InfoMessage
|
当
SQL Server
返回一个警告或信息性消息时发生。
|
提示:可以用事件让一个对象以某种方式通知另一对象产生某些事情。例如我们在
Windows
系统中选择
“
开始
”
菜单,一旦单击鼠标时,就发生了一个事件,通知操作系统将
“
开始
”
菜单显示出来。
使用
SqlConnection
对象连接
SQL Server
数据库
我们可以用
SqlConnection()
构造函数生成一个新的
SqlConnection
对象。这个函数是重载的,即我们可以调用构造函数的不同版本。
SqlConnection()
的构造函数如下表所示:
构造函数
|
说明
|
SqlConnection ()
|
初始化
SqlConnection
类的新实例。
|
SqlConnection (String)
|
如果给定包含连接字符串的字符串,则初始化
SqlConnection
类的新实例。
|
程序代码说明:在上述语法范例的程序代码中,我们通过使用
“new“
关键字生成了一个新的
SqlConnection
对象,并且将其命名为
mySqlConnection
。
现在我们就可以使用如下两种方式连接数据库,即采用集成的
Windows
验证和使用
Sql Server
身份验证进行数据库的登录。
集成的
Windows
身份验证语法范例
string connectionString="server=localhost;database=Northwind;
integrated security=SSPI";
程序代码说明:在上述语法范例的程序代码中,我们设置了一个针对
Sql Server
数据库的连接字符串。其中
server
表示运行
Sql Server
的计算机名,由于在本书中,
ASP.NET
程序和数据库系统是位于同一台计算机的,所以我们可以用
localhost
取代当前的计算机名。
database
表示所使用的数据库名,这里设置为
Sql Server
自带的一个示例数据库
--Northwind
。由于我们希望采用集成的
Windows
验证方式,所以设置
integrated security
为
SSPI
即可。
Sql Server 2005
中的
Windows
身份验证模式如下:
注意:在使用集成的
Windows
验证方式时,并不需要我们输入用户名和口令,而是把登录
Windows
时输入的用户名和口令传递到
Sql Server
。然后
Sql Server
检查用户清单,检查其是否具有访问数据库的权限。而且数据库连接字符串是不区分大小写的。
采用
Sql Server
身份验证的语法范例
string connectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";
程序代码说明:在上述语法范例的程序代码中,采用了使用已知的用户名和密码验证进行数据库的登录。
uid
为指定的数据库用户名,
pwd
为指定的用户口令。为了安全起见,一般不要在代码中包括用户名和口令,你可以采用前面的集成的
Windows
验证方式或者对
Web.Config
文件中的连接字符串加密的方式提高程序的安全性。
Sql Server 2005
中的
Sql Server
身份验证模式如下:
如果你使用其他的数据提供者的话,所产生的连接字符串也具有相类似的形式。例如我们希望以
OLE DB
的方式连接到一个
Oracle
数据库,其连接字符串如下:
string connectionString = "data source=localhost;initial catalog=Sales;
use id=sa;password=;provider=MSDAORA";
程序代码说明:在上述语法范例的程序代码中,通过专门针对
Oracle
数据库的
OLE DB
提供程序,实现数据库的连接。
data source
表示运行
Oracle
数据库的计算机名,
initial catalog
表示所使用的数据库名。
provider
表示使用的
OLE DB
提供程序为
MSDAORA
。
Access
数据库的连接字符串的形式如下:
string connectionString = "provider=Microsoft.Jet.OLEDB.4.0
;
@”data source=c:\DataSource\Northwind.mdb”;
程序代码说明:在上述语法范例的程序代码中,通过专门针对
Access
数据库的
OLE DB
提供程序,实现数据库的连接。这使用的的
OLE DB
提供程序为
Microsoft.Jet.OLEDB.4.0
,并且数据库存放在
c:\DataSource
目录下,其数据库文件为
Northwind.mdb
。
现在我们就可以将数据库连接字符串传人
SqlConnection()
构造函数,例如:
string connectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";
SqlConnection mySqlConnection = new SqlConnection(connectionString);
或者写成
SqlConnection mySqlConnection =new SqlConnection(
"server=localhost;database=Northwind;uid=sa;pwd=sa");
在前面的范例中,通过使用
“new“
关键字生成了一个新的
SqlConnection
对象。因此我们也可以设置该对象的
ConnectionString
属性,为其指定一个数据库连接字符串。这和将数据库连接字符串传人
SqlConnection()
构造函数的功能是一样的。
SqlConnection mySqlConnection = new SqlConnection();
mySqlConnection.ConnectionString = "server=localhost;database=Northwind;uid=sa;pwd=sa";
注意:只能在关闭
Connection
对象时设置
ConnectionString
属性。
打开和关闭数据库连接
生成
Connection
对象并将其设置
ConnectionString
属性设置为数据库连接的相应细节之后,就可以打开数据库连接。为此可以调用
Connection
对象的
Open()
方法。其方法如下:
mySqlConnection.Open();
完成数据库的连接之后,我们可以调用
Connection
对象的
Close()
方法关闭数据库连接。例如:
mySqlConnection.Close();
下面是一个显示如何用
SqlConnection
对象连接
Sql Server Northwind
数据库的实例程序,并且显示该
SqlConnection
对象的一些属性。
范例程序代码如下:
01 public partial class _Default : System.Web.UI.Page
02 {
03 protected void Page_Load(object sender, EventArgs e)
04 {
05 //
建立数据库连接字符串
06 string connectionString = "server=localhost;database=Northwind;
07 integrated security=SSPI";
08 //
将连接字符串传入
SqlConnection
对象的构造函数中
09 SqlConnection mySqlConnection = new SqlConnection(connectionString);
10 try
11 {
12 //
打开连接
13 mySqlConnection.Open();
14 //
利用
label
控件显示
mySqlConnection
对象的
ConnectionString
属性
15 lblInfo.Text = "
<
b
>
mySqlConnection
对象的
ConnectionString
属性为:<
b
>
" +
16 mySqlConnection.ConnectionString + "
<
br
>
";
17 lblInfo.Text += "
<
b
>
mySqlConnection
对象的
ConnectionTimeout
属性为<
b
>
" +
18 mySqlConnection.ConnectionTimeout + "
<
br
>
";
19 lblInfo.Text += "
<
b
>
mySqlConnection
对象的
Database
属性为<
b
>
" +
20 mySqlConnection.Database + "
<
br
>
";
21 lblInfo.Text += "
<
b
>
mySqlConnection
对象的
DataSource
属性为<
b
>
" +
22 mySqlConnection.DataSource + "
<
br
>
";
23 lblInfo.Text += "
<
b
>
mySqlConnection
对象的
PacketSize
属性为<
b
>
" +
24 mySqlConnection.PacketSize + "
<
br
>
";
25 lblInfo.Text += "
<
b
>
mySqlConnection
对象的
ServerVersion
属性为<
b
>
" +
26 mySqlConnection.ServerVersion + "
<
br
>
";
27 lblInfo.Text += "
<
b
>
mySqlConnection
对象的当前状态为<
b
>
" +
28 mySqlConnection.State + "
<
br
>
";
29 }
30 catch (Exception err)
31 {
32 lblInfo.Text = "
读取数据库出错
";
33 lblInfo.Text += err.Message;
34 }
35 finally
36 {
37 //
关闭与数据库的连接
38 mySqlConnection.Close();
39 lblInfo.Text += "
<
br
><
b
>关闭连接后的
mySqlConnection
对象的状态为:<
/b
>
";
40 lblInfo.Text += mySqlConnection.State.ToString();
41 }
42 }
43 }
程序代码说明:在上述范例的程序代码中,我们利用
try catch finally
对数据库连接进行异常处理。当无法连接数据库时将抛出异常,并显示出错信息,见
catch
代码块所示。在此程序中,无论是否发生异常,都可以通过
finally
区块关闭数据库的连接,从而节省计算机资源,提高了程序的效率和可扩展性。
执行结果:
当然,我们还可以采用一种更加简便的方法来实现上述程序的功能。这就是将
SqlConnection
对象包含到
using
区块中,这样程序会自动调用
Dispose()
方法释放
SqlConnection
对象所占用的系统资源,无需再使用
SqlConnection
对象的
Close()
方法。
范例程序代码如下:
01 public partial class _Default : System.Web.UI.Page
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
。
SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Northwind;
integrated security=SSPI;"+"max pool size=10;min pool size=5");
程序代码说明:在上述范例的程序代码中,程序最初在池中生成
5
个
SqlConnection
对象。池中可以存储最多
10
个
SqlConnection
对象。如果要打开新的
SqlConnection
对象时,池中的对象全部都在使用中,则请求要等待一个
SqlConnection
对象关闭,然后才可以使用新的
SqlConnection
对象。如果请求等待时间超过
ConnectionTimeout
属性指定的秒数,则会抛出异常。
下面通过一个程序来显示连接池的性能优势。在应用此程序过程我们要先引用
System.Data.SqlClinet
和
System.Text
命名空间。
范例程序代码如下:
01 public partial class _Default : System.Web.UI.Page
02 {
03 protected void Page_Load(object sender, EventArgs e)
04 {
05 //
设置连接池的最大连接数为5,最小为1
06 SqlConnection mySqlConnection =new SqlConnection(
07 "server=localhost;database=Northwind;integrated security=SSPI;"+
08 "max pool size=5;min pool size=1");
09 //
新建一个
StringBuilder
对象
10 StringBuilder htmStr = new StringBuilder("");
11 for (int count = 1; count
<
= 5; count++)
12 {
13 //
使用
Append()
方法追加字符串到
StringBuilder
对象的结尾处
14 htmStr.Append("
连接对象
"+count);
15 htmStr.Append("
<
br
>
");
16 //
设置一个连接的开始时间
17 DateTime start = DateTime.Now;
18 mySqlConnection.Open();
19 //
连接所用的时间
20 TimeSpan timeTaken = DateTime.Now - start;
21 htmStr.Append("
连接时间为
"+timeTaken.Milliseconds+"
毫秒
");
22 htmStr.Append("
<
br
>
");
23 htmStr.Append("mySqlConnection
对象的状态为
" + mySqlConnection.State);
24 htmStr.Append("
<
br
>
");
25 mySqlConnection.Close();
26 }
27 //
将
StringBuilder
对象的包含的字符串在
label
控件中显示出来
28 lblInfo.Text = htmStr.ToString();
29 }
30 }
程序代码说明:在上述范例的程序代码中,我们将在连接池中重复
5
次打开一个
SqlConnection
对象,
DateTime.Now
表示当前的时间。
timeTaken
表示从连接开始到打开连接所用的时间间隔。可以看出,打开第一个连接的时间比打开后续连接的时间要长,因为第一个连接要实际连接数据库。被关闭之后,这个连接存放在连接池中。再次打开连接时,只要从池中直接读取即可,速度非常快。
提示:
String
对象是不可改变的。每次使用
System.String
类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的
String
对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用
System.Text.StringBuilder
类。例如,当在一个循环中将许多字符串连接在一起时,使用
StringBuilder
类可以提升性能。
Append
方法可用来将文本或对象的字符串表示形式添加到由当前
StringBuilder
对象表示的字符串的结尾处。
执行结果:
ASP.NET 2.0
中连接字符串的设置
在
ASP.NET 2.0
中,使用了一种在运行时解析为连接字符串值的新的声明性表达式语法,按名称引用数据库连接字符串。连接字符串本身存储在
Web.config
文件中的
<
connectionStrings
>
配置节下面,以便易于在单个位置为应用程序中的所有页进行维护。
范例程序代码如下:
<
?xml version="1.0"?
>
<
configuration
>
<
connectionStrings
>
<
add name="Pubs" connectionString="Server=localhost;
Integrated Security=True;Database=pubs;Persist Security Info=True"
providerName="System.Data.SqlClient" /
>
<
add name="Northwind" connectionString="Server=localhost;
Integrated Security=True;Database=Northwind;Persist Security Info=True"
providerName="System.Data.SqlClient" /
>
<
/connectionStrings
>
<
system.web
>
<
pages styleSheetTheme="Default"/
>
<
/system.web
>
<
/configuration
>
程序代码说明:在上述范例的程序代码中,我们在
Web.Config
文件中的<
connectionStrings
>
配置节点下面设置了两个数据库连接字符串,分别指向
pubs
和
Northwind
两个示例数据库。注意,在
2.0
中引进了数据源控件,例如
SqlDataSource
控件,我们可以将
SqlDataSource
控件的
ConnectionString
属性被设置为表达式
<
%$ ConnectionStrings:Pubs %
>,该表达式在运行时由
ASP.NET
分析器解析为连接字符串。还可以为
SqlDataSource
的
ProviderName
属性指定一个表达式,例如
<
%$ ConnectionStrings:Pubs.ProviderName %
>。其具体的用法和新特征将在以后的章节进行详细的介绍。现在有个基础的了解即可。
当然,我们也可以用下面的方式从配置文件直接读取数据库连接字符串。首先我们需要引用
using System.Web.Configuration
命名空间,该命名空间包含用于设置
ASP.NET
配置的类。
string connectionString =ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
程序代码说明:在上述范例的程序代码中,我们可以利用
ConnectionStrings["Northwind"]
读取相应的
Northwind
字符串。同理以可以利用
ConnectionStrings["Pubs"]
读取相应的
Pubs
字符串。