2

Excelのアクティブなワークシートから直接SQLServerデータベースにデータをインポートする最速の方法は何ですか?

行と列をループし、SQL文字列を生成し、ADODB.Connectionを開いて、SQLを実行するだけで大​​成功を収めました。ただし、そのソリューションは、大規模なデータセットには遅すぎます。

だから私はADOでJetプロバイダーをテストしています。間違いなく高速ですが、ブックを保存する必要があり、アップロードする前にユーザーにブックを保存するように要求することはできません。

次のコードは、ブックが保存されている場合は機能しますが、ActiveWorkbookが保存されていない場合、ActiveWorkbook.Pathはnull文字列を返し、コードは失敗します。

Sub UploadViaJet()

    Dim objADO As New ADODB.Connection
    Dim strSQL As String
    Dim lngRecsAff As Long

    Set objADO = New ADODB.Connection

    objADO.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & ActiveWorkbook.Path & _
        "\" & ActiveWorkbook.Name & ";" & _
        "Extended Properties=Excel 8.0"

    strSQL = "SELECT * INTO [odbc;Driver={SQL Server};" & _
        "Server=<server>;Database=<database>;" & _
        "UID=<UID>;PWD=<PWD>].test_table " & _
        "FROM [" & ActiveSheet.Name & "$]"

    objADO.Execute strSQL, lngRecsAff, adExecuteNoRecords

End Sub

これを行うためのより簡単で高速な方法はありますか?

4

4 に答える 4

2

(リンクサーバーまたはを使用してOPENROWSET)データソースを作成し、次の操作を行うことSELECTができますSQL Server

SELECT  *
INTO    mytable
FROM    OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\myfile.xls', 'SELECT * FROM [Sheet$]')

Excelブックのあるパスには、からアクセスできる必要がありますSQL Server

これを行う方法に関するKB記事があります。

于 2009-11-02T21:59:36.780 に答える
1

通常、私はSSISを使用して大きなExcelファイルをインポートします。

于 2009-11-02T21:58:41.297 に答える
1

Excelファイルのインポートを使用したソリューション

ユーザーにファイルの保存を強制しないという制限があり、提案されているほとんどのソリューションではファイルを保存する必要があるため、VBAを使用して

  • メモリ内にブックオブジェクトを作成します
  • アクティブなワークシートからブックに貼り付けをコピーします
  • SAVEAS一時ファイル名(TempExcelFile.xls)とパスへのワークブック
  • 上記のQuassnoiの方法を使用して、SQLServerにインポートします
  • TempExcelFile.xlsをゼロで上書きします
  • TempExcelFile.xlsを削除します

このようにして、ユーザーはワークシートを保存するように強制されることはなく、作業の自然な過程で行うのと同じように、ワークシートを保存するように求められます。

複数のアクティブなワークシートを同時にインポートしやすくするために、タイムスタンプまたはGUIDを使用してファイル名を作成します。


ADOクエリを使用したソリューション

ユーザーに、VBAマクロが組み込まれているテンプレートからワークブックを作成してもらいます。マクロ/コードビハインドへの不正アクセスを防ぐために、ワークブックを保護してください。

行と列をループするマクロを実行し、セル値を読み取り、SQLクエリを作成して実行します。インジェクション攻撃を防ぐために、パラメーター付きのストアドプロシージャを使用します。

于 2009-11-02T22:31:34.357 に答える
0

ActiveWorkBook.SaveAs( "some temp filename")を一番上に置き、そこからインポートしてみましたか?ActiveSheetのコンテンツをリモートサーバーにFTPで転送するマクロを使用して同様のことを行うと、機能します。

于 2009-11-02T22:01:30.043 に答える