快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

避免使用DSN连接数据库

是否仍然在使用ODBC系统或文件DSN连接数据库?请用OLEDB提供者代替它,这是一种速度更快而且不需要使用DSN的数
据库连接技术。使用OLEDB提供者,你不必再为了创建系统DSN恳求ISP(或数据库治理员/网站治理员),也不必为了网站
文件位置的变化而修改配置。

   问:

   我看到过大量通过数据资源名字(DSN)连接数据库的例子,不过我现在想不通过DSN连接数据库。在ASP中可以实现
这一点吗?能否举几个详细的例子说明?我希望新的连接方式不依靠于系统DSN,但又可以在数据库连接串中指定驱动程
序、服务器名字、数据库、数据库账号和密码。

   答:

   假如你使用的是SQL Server 7,请使用下面的数据库连接串:
  
strConnString = "DSN=\\\'\\\';DRIVER={SQL SERVER};" & _
"UID=myuid;PWD=mypwd;" & _
"DATABASE=MyDb;SERVER=MyServer;"



   其中最重要的参数在于“DRIVER=”部分。假如你希望绕过ODBC,直接通过OLEDB访问SQL Server(一般来讲这种方式
速度更快),请使用下面这种连接串:   
strConnString ="Provider=SQLOLEDB.1;Password=mypassword;" & _
"Persist Security Info=True;User ID=myuid;" & _
"Initial Catalog=mydbname;" & _
"Data Source=myserver;Connect Timeout=15"



   假如你要使用数据库连接串,但又不认识OLEDB提供者的连接串语法,请使用Visual Basic的数据环境设计器或ADO数
据控件创建一个,然后把它拷贝出来用于ADO连接对象就可以了。在立刻窗口中,输入命令?
dataenvironment1.connection1.ConnectionString可以得到连接串的代码。请注重Microsoft Access连接串的语法有所不
同,参见《Syntax for DSN-Less Connection for MS Access》

   参见:《ASP性能优化指南》中的数据库连接部分。

2、记录集中记录总数的计算
1062


   刚开始在ASP页面中使用记录集的时候可能常常会碰到这个问题。假如你想访问记录集中的数据,首先必须保证记录
集中确实包含数据。请记住,假如记录集中没有数据,系统将显示异常不友好的运行时错误信息。你可以使用下面的代码
去解决这种问题。

   问:

   我已经有数年的VB经验,但刚刚开始学习ASP和VBScript。现在我要打开一个Access数据库,计算其中的记录总数并
在Web页面中显示这些信息。数据库的名字叫sean.mdb,其中包含一个people表,表中有三个记录。然而,当我运行脚本时
它总是说有-1个记录。

   是否可以告诉我下面的代码什么地方出错了?   
< %

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRst = Server.CreateObject("ADODB.Recordset")

objConn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=
" & Server.Mappath("seannewelldbsean.mdb"))

strSQL = "SELECT * FROM people"

objRst.Open strSQL, objConn

Response.write( "< P >" & strSQL & "< /P >" )
Response.write("< H2 >There are " & objRst.RecordCount &
" People in the database< /H2 >")

If objRst.RecordCount > 0 Then
objRst.MoveFirst
Do While Not objRst.EOF
Response.write( "Name = " & objRst.fields(0) )
objRst.MoveNext
Loop
else
Response.write( "It\\\'s EMPTY!" )
End If

objRst.Close
Set objRst = Nothing
objConn.Close
Set objConn = Nothing
% >



   答:

   在低版本的MDAC中RecordCount属性返回-1。请在你的服务器上把MDAC文件更新到最新的版本,最新的MDAC文件可以
在www.microsoft.com/data找到。

   假如Web服务器由ISP治理而你又无权配置它,无法升级MDAC文件,那么必须修改代码。

   原来使用下面的代码检查记录集中是否有记录:   
If objRst.RecordCount > 0 Then ...



   请改用下面的代码:   
If objRst.BOF and objRst.EOF Then
\\\' 记录集为空
Else
Do While not objRst.EOF
\\\' 处理记录集
objRst.MoveNext
Loop
End If

   2000年06月30日更新,新西兰的Daryl Egarr说:

   可以看出,读者提问中的代码并没有错误。问题在于“在低版本的MDAC中RecordCount属性返回-1”,这一判定本身
并没有错误,然而从提问内容来看作者不应该作出这种假定,因为原问题中没有任何一行代码意味着使用了低版本的
MDAC。

   作者考虑问题的方向不对,问题的要点在于并非所有的游标类型都支持所有的属性和方式(不管采用哪种数据库系
统)。问题中代码出现错误的真正原因在于使用默认的CursorLocation时:   
Recordset.CursorLocation = adUseServer

   RecordCount属性只有在记录集的CursorType为1或者3(即adOpenKeyset,adOpenStatic)时才是可用的。出现错误
的代码没有指定CursorType,也就是使用了0类型的游标(即adOpenForwardOnly,这是速度最快的游标类型),此时对
RecordCount的引用将一直返回0。

   解决问题的方式很简朴,只要把原来代码中的:   
objRst.Open strSQL, objConn

   改成:   
objRst.Open strSQL, objConn ,1
返回类别: 教程
上一教程: 将SQL SERVER中所有表的列信息显示出来
下一教程: MYSQL数学函数不求人

您可以阅读与"避免使用DSN连接数据库"相关的教程:
· 样设置为使用OLEDB连接我的ACCESS数据库
· 并入子网后为什么无法连接数据库
· 使用DELPHI6的DBEXPRESS组件连接远程的MYSQL数据库
· SQL Server端口更改后的数据库连接方法
· PHPLIB 和多个数据库连接
    微笑服务 优质保证 索取样品