2

ユーザーが Excel ファイルをアップロードする ASP ページがあります。ファイルが正常にアップロードされたら、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
4

3 に答える 3

3

Thank you Hans, Tim and Remou. I followed this example 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
于 2012-07-26T19:12:49.070 に答える
1

あなたは「... REGION タブの行を取得して、MS Access 2007 テーブルに挿入したい」と言いました。

サンプル コードを完全には理解していませんが、Access テーブル用に 1 つのレコードセットを開き、Excel ワークシート用に別のレコードセットを開き、Excel レコードセットを移動して各行を Access レコードセットに挿入しているようです。

Access レコードセットが編集可能 (読み取り専用ではない) の場合は、何かを挿入できます。ただし、それが機能したとしても、RBAR (Row By Agonizing Row) アプローチが残ることになります。すべてのワークシート行を 1 回の操作でインポートするように、セットベースのアプローチを使用することをお勧めします。

これは、あなたがやろうとしていることを模倣した 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ます。INSERTASP コードは、現在のものよりもはるかに単純になり、かなり高速に動作するはずです。

于 2012-07-26T14:19:01.093 に答える
1

別のカーソル タイプが必要です。adOpenStatic は更新をサポートしていません。

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

于 2012-07-26T07:06:04.037 に答える