我有一个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
答案 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不支持更新。
答案 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代码将比现在的代码简单得多,并且运行速度要快得多。