connection 连接mysql_用connection对象连接数据库
本文将详细介绍如何使用connection对象连接数据库。对于不同的.net数据提供者,ado.net采用不同的connection对象连接数据库。这些connection对象为我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。connection类有四种:sqlconnection,oledbconnection,odbcconnection和oracleconnection。sqlconn
本文将详细介绍如何使用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字符串。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
更多推荐




所有评论(0)