关于ASP连接Excel数据库无法更新的问题

无法更新的问题。错误提示:

Microsoft JET Database Engine (0x80004005)
操作必须使用一个可更新的查询。
注意:Excel数据库中的表能正常读出,但不能更新。已排出不是IIS目录权限问题,因为同目录下的是Access数据库就没这个问题,能更新。是不是Excel中有什么设置?(微软网上有一篇相应文章,但我不能找到它指的设置对话框)
问题补充: 字符串连接没问题,Excel文件能读出,不能写入。
权限没问题,同一个文件夹中的Access数据库读写都正常。
连接字符串如下:
set Conn1=server.createobject("adodb.connection")
Conn1.open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='EXCEL 8.0;HDR=YES;IMEX=1';Data Source="&server.MapPath("../dcdata/score.xls")

这是个基于WEB的程序,客户(远端)要一个Excel表来打印数据。

在微软的知识库中查到的。需在连接字符串中加入“ReadOnly=0”,因为Excel在与ASP连接时默认为只读,但其它数据库(Accsee、SQL等)默认则为可读写的。
 
以下都可以读写
'connstr="driver={microsoft excel driver (*.xls)};ReadOnly=0;dbq="&server.mappath("aa.xls")
'connstr="driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")
'connstr= "driver={Microsoft Excel-Treiber (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")
'connstr="driver={Driver do Microsoft Excel (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")
connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("aa.xls") &" ;Extended Properties=Excel 8.0"
 
操作说明:
1。数据提供程序使用Jet,同时需要指定Extended Properties 关键字设置 Excel 特定的属性,不同版本的Excel对应不同的属性值:用于 Extended Properties 值的有效 Excel 版本。
对于 Microsoft Excel 8.0 (97)、9.0 (2000) 和 10.0 (2002) 工作簿,请使用 Excel 8.0。

对于 Microsoft Excel 5.0 和 7.0 (95) 工作簿,请使用 Excel 5.0。

对于 Microsoft Excel 4.0 工作簿,请使用 Excel 4.0。

对于 Microsoft Excel 3.0 工作簿,请使用 Excel 3.0。

ref:http://msdn.microsoft.com /library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp

2。数据源路径使用物理绝对路径(同Access)

3。如何引用表名?
对 Excel 工作簿中表(或范围)的有效引用。
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:

 

select * from [Sheet1$]
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如:

select * from [Sheet1$A1:B10]
若要引用指定的范围,请使用该范围的名称。例如:

select * from [MyNamedRange]
ref:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS /dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp

说明:
可以引用Excel 工作簿中的三种对象:
• 整张工作表:[Sheet1$] ,Sheet1 就是工作表的名称
• 工作表上的命名单元格区域:[MyNamedRange] (不需要指定工作表,因为整个xls中命名区域只能唯一)
XLS命名方法:选中单元格范围》插入》名称》定义
• 工作表上的未命名单元格区域 :[Sheet1$A1:B10]
(在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)

注意:
•必须使用[](方括号),否将报:
FROM 子句语法错误
•必须跟$(美元符号),否则报:
Microsoft Jet 数据库引擎找不到对象'Sheet2'。请确定对象是否存在,并正确地写出它的名称和路径。
•如果工作表名称不对,或者不存在,将报:
'Sheet2$' 不是一个有效名称。请确认它不包含无效的字符或标点,且名称不太长。
•在 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据   中提到可以使用
~ 和 '(波浪线和单引号)代替[],使用ADO。NET测试没有成功,报:
FROM 子句语法错误
•当引用工作表明名([Sheet1$])时,数据提供程序认为数据表从指定工作表上最左上方的非空单元格开始。比如,工作表从第 3 行,C 列开始,第3行,C列之前以及第1、2行全为空,则只会显示从第3行,C列开始的数据;以最后表最大范围内的非空单元结束;
•因此,如需要精确读取范围,应该使用命名区域 [NamedRange],或者指定地址:[Sheet1$A1:C10]

4。如何引用列名?
•根据默认连接字符串中,数据提供程序会将有效区域内的第一行作为列名,如果此行某单元格为空则用F1、F2表示,其中序数,跟单元格的位置一致,从1开始;
•如果希望第一行作为数据显示,而非列名,可以在连接串的 Extended Properties 属性指定:HDR=NO
默认值为:HDR=NO 格式如下:

        string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                        "Extended Properties=\"Excel 8.0;HDR=NO\";" +
                        "data source=" + xlsPath;
help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/Html/745c5f95-2f02-4674-b378-6d51a7ec2490.htm 中 《连接Excel》节(说明:在我自己的MSDN中,它的例子使用了两个双引号是错的,测试没有通过,原文这样说的:

注意,Extended Properties 所需的双引号必须还要加双引号。

在这种情况下,所有的列名都是以F开头,然后跟索引,从F1开始,F2,F3。。。。。。。

5。为什么有效单元格数据不显示出来?
出现这种情况的可能原因是,默认连接中,数据提供程序根据前面单元格推断后续单元个的数据类型。
可以通过 Extended Properties 中指定 IMEX=1

“IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取

 

小例子:
<%set conn = server.createobject("adodb.connection")
'connstr="driver={microsoft excel driver (*.xls)};ReadOnly=0;dbq="&server.mappath("aa.xls")
'connstr="driver={Microsoft Excel Driver (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")
'connstr= "driver={Microsoft Excel-Treiber (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")
'connstr="driver={Driver do Microsoft Excel (*.xls)};ReadOnly=0;dbq=" & server.mappath("aa.xls")

connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& server.mappath("aa.xls") &" ;Extended Properties=Excel 8.0"
conn.open connstr%>
<% set rs = server.CreateObject("adodb.recordset")
sql="select * from [Page1$]"
rs.open sql, conn ,1,1
if rs.eof then
response.Write "无数据"
else
do while not rs.eof %>
<%= rs(0) %> <%
rs.movenext
loop
end if
%>
<% set rs = server.CreateObject("adodb.recordset")
sql="select * from [Page1$]"
rs.open sql, conn ,1,3
rs.addnew
rs(0)="bb"
'// /*rs("b")="slkdfjl"*/
rs.update
rs.close
set rs= nothing
conn.close
set conn= nothing
%>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值