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

一个网站程序,在添加新闻时出现错误

以下是错误提示:

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则不会出现这种情况。

对于这种情况的适应,我们只能是通过一个变量。让备注字段的内容先给一个变量,而不是直接引用。

时间: 2024-11-08 21:25:16

asp Driver和Provider两种连接字符串连接Access时的区别的相关文章

asp Driver和Provider两种连接字符串连接Access时的区别_数据库相关

一个网站程序,在添加新闻时出现错误 以下是错误提示: Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21' 多步 OLE DB 操作产生错误.如果可能,请检查每个 OLE DB 状态值.没有工作被完成. 出现这种错误的原因是因为我把access连接字符串修改为"Driver={Micorsoft Access Driver ()};dbq=" & Server.Mappath(DbPath),而原来的连接字符串为&qu

ASP+中文显示之两种解决方法

ASP+中文显示之两种解决方法 作者刚开始写ASP+程序时候碰到的第一个比较大的问题就是中文显示问题,运行后发现ASP+从数据库中读出来的中文全部变成了?????,有点类似jsp中的这个频率出现最高的中文显示问题了,查了资料发现有种方法可以轻松解决中文问题. 方法一: 在翻阅了微软NGWS文档后发现在文档的常见问题部分有提到要添加一个config.web文件到 web目录下,试了一下,中文显示果然OK了. 方法如下: 建立一个文件config.web,内容如下,放在WEB目录下 <configu

实例-Android 与蓝牙键盘两种方式都连接不上,可是与hc06可以连接,uuid的问题还是其他问题

问题描述 Android 与蓝牙键盘两种方式都连接不上,可是与hc06可以连接,uuid的问题还是其他问题 class ItemClickEvent implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { btAdapt.cancelDiscovery(); String str =

两种php 字符串替换函数

本文章主要讲到两种php 字符串替换函数 str_replace与substr_replace前一种是替换所有haystace中的needle,并返回haystace替换后的结果,而substr_replace替换字符串string中的一部分具体哪能一部分则取决于起始位置和可选参数length的值 最常用str_replace() 函数原型: mixed str_replace(mixed needle,mixed new_needle,mixed haystace[,int &count])

js两种拼接字符串的简单方法(必看)_javascript技巧

如下所示: function(msgArr) { var len = msgArr.length; var n = 0 ; var htmlSpan = ""; for (var j = 0; j < len - 1; j++) { htmlSpan += '<span>·</span>'; } htmlSpan += '<span class="on">·</span>'; var imgs = []; var

link以下两种写法结果一样,有什么区别?

问题描述 link以下两种写法结果一样,有什么区别? 写法1: scores.GroupBy(x=>x.StuID).OrderBy(x =>x.Sum()).ThenBy(x => x.Key) 写法2: scores.GroupBy(x=>x.StuID).OrderBy(x =>x.Key).OrderBy(x=>x.Sum()) 解决方案 写法2不推荐,理论上这个结果和写法1一样,但是基于这样一个假设,那就是OrderBy执行的是稳定的排序. 所谓稳定的排序,就

通过JS和PHP两种方法判断用户请求时使用的浏览器类型_javascript技巧

在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko)

c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢)

问题描述 c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢) c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢) 一:Savingaccount::Savingaccount(int date,int id,double rate):id(id),balance(0),rate(rate),lastdate(date),accumulation(0) { //构造函数的第一种实现方式 cout<<date<<"t#"

c++连接mysql数据库的两种方法(ADO连接和mysql api连接)_C 语言

第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的SQL语句不太兼容标准SQL语句,需要做一些处理,这里暂时不说.第二种方法只能针对于mysql数据库的连接,不过用这种方法不用安装MyODBC服务器程序. 不管用哪种方法,首先需要安装Mysql数据库,安装方法请看"mysql安装及一些注意点".最好安装一个Navicat for mysql,方便操作mysql数