【问题标题】:Microsoft.ACE.OLEDB.12.0 Current Recordset does not support updating error received when trying to update accessMicrosoft.ACE.OLEDB.12.0 当前记录集不支持尝试更新访问时收到的更新错误
【发布时间】:2012-07-24 07:25:46
【问题描述】:

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

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

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

【问题讨论】:

  • 我刚刚注意到你有“服务器”。你检查过文件夹的权限吗?
  • 另外,您是否打算为每个字段创建一个新记录?如果没有,您需要一个 AddNew、字段循环和更新。不管你做什么,摆脱 BatchUpdate。我不相信它会按照你的想法做。

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


【解决方案1】:

谢谢汉斯、蒂姆和雷穆。我按照这个例子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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的。但是,它仍然无法与该循环正常工作,该循环会为每个字段添加一条新记录,并且会在 rstAccess.UpdateBatch 上失败,因为记录已添加。
    • 同意 - 那里可能存在其他问题。如您所述,如果您使用 AddNew 的参数化版本,则不需要更新批处理。
    【解决方案3】:

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

    虽然我不完全理解您的示例代码,但您似乎正在为 Access 表打开一个记录集,为 Excel 工作表打开另一个记录集,然后在 Excel 记录集中移动并插入(something for ) 将每一行放入 Access 记录集中。

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

    这是一个 Access 查询,它模仿了我认为您正在尝试做的事情。我的Region 工作表有 4 列数据:% Over/Underfld2; 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 连接,然后使用与您的 INSERT 语句的Execute 的连接。您的 ASP 代码将比您现在的代码简单得多,并且运行速度应该更快。

    【讨论】:

    • 汉斯由于某种原因我只能投 1 票。如果您没有建议,我将不会探索 INSERT,我该如何提供更多。
    • 您只能为一个答案投票一次。我很高兴我的建议对您有所帮助,并感谢您的投票。一票就好。 :-)
    猜你喜欢
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多