本文将详细介绍如何使用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身份验证模式如下:

20061130145912648.jpg

注意:在使用集成的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身份验证模式如下:

20061130145917183.jpg

如果你使用其他的数据提供者的话,所产生的连接字符串也具有相类似的形式。例如我们希望以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区块关闭数据库的连接,从而节省计算机资源,提高了程序的效率和可扩展性。

执行结果:

20061130145919847.jpg

当然,我们还可以采用一种更加简便的方法来实现上述程序的功能。这就是将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 对象表示的字符串的结尾处。

执行结果:

20061130145920318.jpg

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字符串。

down_info.asp?id=41071

文章整理:西部数码--专业提供域名注册、虚拟主机服务

http://www.west263.com

以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

Logo

一站式 AI 云服务平台

更多推荐