Microsoft.ACE.OLEDB.12.0当前记录集不支持更新尝试更新访问时收到的错误

时间:2012-07-25 19:14:32

标签: excel ms-access vbscript ms-access-2007 adodb

我有一个ASP页面,用户将上传excel文件。文件成功上载后,我想获取REGION选项卡中的行,并将它们插入到MS Access 2007表中。下面是我使用的代码,我收到此错误。我可以将记录集更新与Microsoft.ACE.OLEB.12.0提供程序一起使用吗?有一个更好的方法吗? ADODB.Recordset错误'800a0cb3'

当前Recordset不支持更新。这可能是提供者或所选锁定类型的限制。

Set cnnExcel = Server.CreateObject("ADODB.Connection")
cnnExcel.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=" & strExcelFile & ";" & _
                    "Extended Properties=" &  Chr(34) & "Excel 12.0 Xml;HDR=Yes;IMEX=1" & Chr(34) & ";" 
Response.Write "Excel connection opened<BR>"

' Load ADO Recordset with Excel Data
Set rstExcel = Server.CreateObject("ADODB.Recordset")
rstExcel.Open "Select * from [REGION$]", cnnExcel, adOpenStatic 
Response.Write "Excel Recordset loaded<BR>"

' Open Access Connection
Set cnnAccess = Server.CreateObject("ADODB.Connection")
cnnAccess.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strAccessFile & ";Persist Security Info=False;" 
Response.Write "Access connection opened<BR>"
Const adOpenStatic = 1
Const adLockOptimistic = 3
Const adCmdText = &H0001
' Load ADO Recordset with Access Data
Set rstAccess = Server.CreateObject("ADODB.Recordset")
rstAccess.Open "REGION", cnnAccess, adOpenStatic, adLockOptimistic, adCmdTable
Response.Write "Access Recordset loaded<BR>"

' Synchronize Recordsets and Batch Update
Do Until rstExcel.EOF

        ' .AddNew
        For each field in rstExcel.Fields
            If field.Name = "% Over/Under" Then
                rstAccess.AddNew field.Name,0
            Else
                rstAccess.AddNew field.Name,field.Value
            End If
        Next

    rstExcel.MoveNext
Loop
rstAccess.UpdateBatch

3 个答案:

答案 0 :(得分:3)

谢谢Hans,Tim和Remou。我按照这个例子Using INSERT INTO to write data into access database

  ' Open Access Connection
Set cnnAccess = Server.CreateObject("ADODB.Connection")
cnnAccess.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strAccessFilePath & ";Persist Security Info=False;"   
cnnAccess.Execute "DELETE * FROM REGION"
'Open Excel Connection
Set cnnExcel = Server.CreateObject("ADODB.Connection")
cnnExcel.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                "Data Source=" & strExcelFilePath & ";" & _
                    "Extended Properties=" &  Chr(34) & "Excel 12.0 Xml;HDR=Yes;IMEX=1" & Chr(34) & ";" 
Response.Write "Excel connection opened<BR>"
cnnExcel.Execute "INSERT INTO REGION IN 'C:\inetpub\wwwroot\FolderName\App_Data\AccessFileName.accdb' " & _
                "Select col1,col2,col3,col4" & _
               "from [REGION$]"


' Clean up    
cnnExcel.Close
Set cnnExcel = Nothing
cnnAccess.Close
Set cnnAccess = Nothing

答案 1 :(得分:1)

您需要不同的游标类型 - adOpenStatic不支持更新。

http://www.w3schools.com/ado/prop_rs_cursortype.asp

答案 2 :(得分:1)

你说“ ...我想在REGION选项卡中获取行并将它们插入MS Access 2007表”。

虽然我不完全理解您的示例代码,但您似乎打开Access表的一个记录集,另一个打开Excel工作表,然后移动Excel记录集并插入(某些 )每行进入Access记录集。

如果Access记录集是可编辑的(即不是只读的),则可以插入某些内容。但是,即使你让它工作,你仍然会留下一个RBAR(Row By Agonizing Row)方法。最好使用基于集合的方法,以便将所有工作表行导入为单个操作。

这是一个Access查询,模仿我认为你想要做的事情。我的Region工作表有4列数据:% Over/Under; fld2; fld3;和fld4。 Access REGION表具有相同的4列,设置了兼容的数据类型。

INSERT INTO REGION ( [% Over/Under], fld2, fld3, fld4 )
SELECT 0 AS [% Over/Under], fld2, fld3, fld4
FROM [Excel 12.0 Xml;HDR=Yes;IMEX=1;DATABASE=C:\share\Access\regions.xlsx].[Region$];

如果您可以在Access数据库中使用类似的查询,请更改ASP以打开与Access数据库的ADO连接,然后使用Execute INSERT语句的连接。您的ASP代码将比现在的代码简单得多,并且运行速度要快得多。