当前位置: 首页 > 图文教程 > 网络编程 > ASP > asp Driver和Provider两种连接字符串连接Access时的区别

ASP
asp生成三维饼图的函数
ASP下的简洁的多重查询的方法与函数 真不错
发一个ASP的ADODB类代码
A利用ASP小偷和Google实现在线翻译功能的代码
ASP类型网站结合动网论坛会员的方法
Asp下实现多表单域无组件文件上传的实例
asp制作中常用到的函数库集合
易心asp分页类 v1.0
asp中xmlhttp组件发包
检测是否为数字类型的asp代码
可以获得文件的文件名的asp函数
用asp实现访问远程计算机上MDB access数据库文件的方法
用ASP实现写IIS日志的代码
asp在IE浏览器中下载服务端上的各类文件的实现方法
asp汉字中文图片验证码的实现代码
asp WAP获取手机终端信息的一段代码
asp取得数组中的最大值的方法
用asp实现的截取指定格式字符串的代码
asp jmail发邮件 详细解析
ASP编程中连接数据库和数据库操作的常用代码

ASP 中的 asp Driver和Provider两种连接字符串连接Access时的区别


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

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21' 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。 一个网站程序,在添加新闻时出现错误
以下是错误提示:
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21'
多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。
出现这种错误的原因是因为我把access连接字符串修改为"Driver={Micorsoft Access Driver ()};dbq=" & Server.Mappath(DbPath),而原来的连接字符串为"Provier=Microsoft.Jet.OLEDB.4.0;Data source=" & Server.Mappath(DbPath) 时则不会出现这种错误。看来这两种连接access数据库的方式还是有一定区别的。至少后一种连接方式在容错性上好一些,但很明显在规范上是不太正规的。
为了叙述得简单,我下面把这两种方式分别叫做provider连接和driver连接。
上述错误在修改新闻时却不会出现。我看了一下代码发现在执行添加时,有一个用Excute取得的记录集未进行关闭。我关闭了一下也无法正确执行。
于是我写了一段代码,又另外设计了一个简单的表格,发现这时两种连接方法可以添加进去,于是我又将这段代码中的表换回原来的,还是不可以执行。难道与表有关?
于是我开始仔细的研究表格,发现原表格有一个自动编号字段在程序中被赋值了。我记得自动编号是不可以被赋值的呀。于是我把那个表的自动编号一去,结果可以正常执行。
看来用Provider方式连接是可以对自动编号字段赋值的。
下面说一下另一个地方的区别。
我使用driver连接时,在频道设置时出现了一个Null值,但是实际上在数据库中是有值的,我看了一下这个字段的数据类型,是备注。那是不是说driver驱动对长的备注支持也不太好呢?不会吧,我那个新闻表中的新闻内容一定是备注的呀,应该不是这方面的原因。
是什么方面的原因呢?难道是因为他是位于另一个备注的后面?可是新闻表中也有两个备注并且内容备注也是位于简介备注的后面呀。这种怀疑也被排除。
是因为这个字段是有关键字的原因?我把这个字段值改为1,结果也是出错。
那是什么方面的原因呢?
干脆自己再写一个页面测试,测试代码如下
以下是测试代码:
复制代码 代码如下:

dim conn
set conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'driver连接方式
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'provider连接方式
set rs=conn.execute("select * from s_channel where channelID=11")
response.Write rs("UploadSetting")
rs.close
set rs =nothing

如果发现两种连接能正常的输出。
于是我在原代码的刚打开记录集的地方输出(response.write)了一下,发现在那个位置可以正常输出该字段的值。于是我把输出代码不停的向下移动,最终移动到
以下是代码片段:
复制代码 代码如下:

if IsNull(rs("UploadSetting")) or rs("UploadSetting")="" then
UploadSetting=Split("1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg|asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1","@")
else
UploadSetting=Split(rs("UploadSetting"),"@")
end if

放到if上面可以正常的输出内容,但是放到else后面就输出Null什么原因呢?
于是最终的测试代码如下
以下是测试代码:
复制代码 代码如下:

dim conn
set conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'driver连接方式
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'provider连接方式
set rs=conn.execute("select * from s_channel where channelID=11")
response.Write rs("UploadSetting")
if IsNull(Rs("UploadSetting")) or rs("UploadSetting")="" then
response.Write "dd"
else
response.Write rs("UploadSetting")
end if
rs.close
set rs =nothing

以上代码,在使用provider方式连接时,能正确输出rs("uploadSetting")中的值,而在Driver方式下则什么也不输出。
我们是不是可以这么理解:就是在Driver方式下,对备注内容的引用只能有一次,而再次引用时则变为NULL值。而Provider则不会出现这种情况。
对于这种情况的适应,我们只能是通过一个变量。让备注字段的内容先给一个变量,而不是直接引用。