当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 数据访问-与数据库建立连接

MSSQL
用SQL语句实现替换字符串
mssql查找备注(text,ntext)类型字段为空的方法
MSSQL数据类型及长度限制详细说明
SQL Server下几个危险的扩展存储过程
一些SQL Server存储过程参数及例子
sql高级技巧几个有用的Sql语句
SQL语句实现SQL Server 2000及Sql Server 2005日志收缩(批量)
用SQL建立索引的方法步骤
MSsql每天自动备份数据库并每天自动清除log的脚本
mssql无数据库日志文件恢复数据库的方法
SQL Server常用管理命令小结
SQL SERVER性能优化综述(很好的总结,不要错过哦)
sqlserver 游标的简单示例
sqlserver只有MDF文件恢复数据库的方法
在SQL Server启动时自动执行存储过程。
在 SQLSERVER 中快速有条件删除海量数据
阿拉伯数字转大写中文_财务常用sql存储过程
SQL Server存储过程的基础说明
列出SQL Server中具有默认值的所有字段的语句
文本、Excel、Access数据导入SQL Server2000的方法

MSSQL 中的 数据访问-与数据库建立连接


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 44 ::
收藏到网摘: n/a

  在第一部分,我们讨论了如何优化 ASP 代码。在这一部分,我们把重点放在数据访问上。

一般情况下,数据访问时间要比 ASP 代码解释,编译时间长,不要让数据检索成为影响 ASP 性能的瓶颈。

首先,讲一些老生常谈的话。比如:需要声明变量,要用 Response.Write SQL_string 来进行调试,要用 On Error Resume
Next 来捕获错误。不要在 Application 和 Session 中存储 Connection 对象等等,都是一些很多人知道而又不屑一顾的常
识。

提高数据访问速度包含两方面内容:1 与数据库建立连接。2 检索数据。

建立高效的连接是优化数据库访问的第一步。你需要了解连接池的概念( 参见文章: 连接池(Connection Pooling)介绍 );了解
连接数据库的方法。另外,测试是很重要的,如果你想亲自进行测试,可以下载上一部分提到的 WAST ,它可以模拟大量用户同时
点击的情况。在这里,假设你使用的数据库是 MS SQL Server 7.0 ,如果 操作系统是 NT ,那么你可以在性能监视器中监测
SQL7 的用户连接数(counter:User Connections);如果操作系统是98的话,可以使用 SQL7 的 Profiler。

下面,开始讨论如何与数据库建立连接,以及连接池的问题。

1. 使用 OLEDB

与数据库建立连接有三种方法:DSN,DSN-less,OLEDB( 参见文章: 用ADO连接数据库的三种方法 )。建议使用 OLEDB。

2. 尽快释放数据库对象

假设有 page1.asp 和 page2.asp,在多人同时点击的情况下,服务器可能会这样工作:

第一个人:page1.asp 的1-5行,
第二个人:page1.asp 的1-5行,
第一个人:page1.asp 的6-20行,
第二个人:page1.asp 的1-5行,
第三个人:page1.asp 的1-5行,
第四个人:page1.asp 的1-5行,
第二个人:page1.asp 的6-20行,
第一个人:page2.asp 的1-5行,
......

设想一下:有几千人同时访问你的主页,那么,服务器就会执行数千行,数万行语句后才回到第一个人请求的页面上。因此,我们
应尽可能快的处理某个功能,某个任务。看下列代码:

<%
rs1.Open strSQL1,cnn1         'cnn1 is connection object
rs2.Open strSQL2,cnn2
rs3.Open strSQL3,cnn3
......
'处理 rs1
'处理 rs2
'处理 rs3
......
rs1.Close
rs2.Close
rs3.Close
cnn1.Close
cnn2.Close
cnn3.Close
%>

这种处理结果集的方法会占用比你想象要多的资源,正确的用法应为:

<%
rs1.Open strSQL1,cnn         'cnn is connection object
'处理 rs1
rs1.Close
cnn1.Close
......
rs2.Open strSQL2,cnn
'处理 rs2
rs2.Close
cnn2.Close
......
rs3.Open strSQL3,cnn
'处理 rs3
rs3.Close
cnn3.Close

......
%>

或许你会说:在 rs2 的处理中,我还需要 rs1 的值,所以不能在处理 rs2 前关闭 rs1。那么解决这个问题更好的办法是采用
GetRows 和 GetString,在后面会有详细的说明。

尽快的释放对象是保证数据库连接重用的前提。( 参见文章: 让数据库的连接更有效 )

3. 创建 Connection 对象,充分利用连接池。

看下列代码:

'创建 Connection Object,打开 RecordSet
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnection
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open strSQL,cnn

'直接打开 RecordSet
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.open strSQL,strConnection

在 asptoday 的 Enhancing Performance in ASP - Part 2 中对这两种方法进行了测试,结果表明直接打开 RecordSet 比创
建 Connection 快23%(快在页面处理上,检索数据库的速度是一样的。)所以,这篇文章的结论是:When working with a
single Recordset,pass the connection string into the ActiveConenction property.

我对此有异议:快的代码不一定是好的代码。

首先要说明的是,直接打开 RecordSet 的方法依然要创建与数据库的连接,只不过是由 ADO 自动完成的。其次,这个
Connection 只有在该页面处理完后才能被释放(不管是 Recordset.Close 还是 Set recordset = Nothing 都不能做到释放该
对象)。

Dim rs
Dim strcnn
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM Authors",strcnn
    rs.Close
    Set rs = Nothing
Next&nb