2

我有一个 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
4

3 回答 3

3

谢谢汉斯、蒂姆和雷穆。我按照这个例子使用 INSERT INTO 将数据写入访问数据库

  ' 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
于 2012-07-26T19:12:49.070 回答
1

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

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

于 2012-07-26T07:06:04.037 回答
1

你说“ ......我想把 REGION 选项卡中的行插入到 MS Access 2007 表中”。

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

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

这是一个 Access 查询,它模仿了我认为您正在尝试做的事情。我的Region工作表有 4 列数据% Over/Underfld2; fld3; 和fld4。AccessREGION表具有相同的 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 代码将比您现在拥有的代码简单得多,并且运行速度应该快得多。

于 2012-07-26T14:19:01.093 回答