SQLへのExcelは、SQL Serverに特定の行を追加

excel sql sqlbulkcopy vb.net

質問

cmd.CommandText = (Convert.ToString("SELECT * From [") & excelSheet) & "] Order By" & columnCompany & "OFFSET 0 ROWS  FETCH NEXT 100000 ROWS ONLY "

私はSQLのテーブルにデータフォームをExcelにマップしようとしていますが、エクセルテーブルにはレコードがたくさんあるので、すべてのレコードを一度に追加しようとするとメモリが足りなくなります。だから私がしようとしているのは、このコード行を使うことです

cmd.CommandText = (Convert.ToString("SELECT * From [") & excelSheet) & "] Order By B OFFSET 0 ROWS  FETCH NEXT 100000 ROWS ONLY " 

100000行が追加されるようにします。それから私は、データテーブルをクリアし、100001から200000まで同じようにするつもりです。

しかし、私はこれを正しく動作させることはできません、それはちょうどSELECT TOP 100000 FROM...ているときに正常に動作しSELECT TOP 100000 FROM...しかし、私は次の100000レコードを取得する方法を知っていません。 Order Byは、正しい列を取得する方法がわからないため、問題がどこにあるかと思います。

ここに私のコードは以下です

 Private Sub btnMap_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMap.Click

    'Allows columns to be moved mapped in the correct order
    Dim nbColumnsToTransfer As Integer = dgvMapped.Columns.GetColumnCount(1)

    Dim indexes As List(Of Integer) = (From column As DataGridViewColumn In dgvLoadedata.Columns.Cast(Of DataGridViewColumn)() _
                                          Take nbColumnsToTransfer _
                                          Order By column.DisplayIndex _
                                          Select column.Index).ToList()

    Dim columnCompany As Integer = indexes(0)
    Dim columnEmail As Integer = indexes(1)
    Dim columnFirstName As Integer = indexes(2)
    Dim columnSurname As Integer = indexes(3)
    Dim columnPostCode As Integer = indexes(4)
    Dim columnTelephone As Integer = indexes(5)
    Dim columnEmployeeBand As Integer = indexes(6)

    Dim DeleteConnection As New Data.SqlClient.SqlConnection
    DeleteConnection.ConnectionString = "Data Source=DC01\SQLEXPRESS;Initial Catalog=YCM;User ID=sa;Password=S0rtmypc!"
    DeleteConnection.Open()
    Dim sqlDTM As String = "Delete From TempMapped"
    Dim command As New SqlCommand(sqlDTM, DeleteConnection)
    command.ExecuteNonQuery()
    Dim sqlDTSR As String = "Delete From TempSplitReq"
    command = New SqlCommand(sqlDTSR, DeleteConnection)
    command.ExecuteNonQuery()
    DeleteConnection.Close()

    If chkContactSplitReq.Checked = True Then

        Dim dt As New DataTable()
        Using con As New OleDbConnection(conString)
            Using cmd As New OleDbCommand()
                Using oda As New OleDbDataAdapter()
cmd.CommandText = (Convert.ToString("SELECT * From [") & excelSheet) & "] Order By" & columnCompany & "OFFSET 0 ROWS  FETCH NEXT 100000 ROWS ONLY ""
                    cmd.Connection = con
                    con.Open()
                    oda.SelectCommand = cmd
                    oda.Fill(dt)
                    con.Close()
                End Using
            End Using
        End Using

        Dim connection As String = "Data Source=DC01\SQLEXPRESS;Initial Catalog=YCM;User ID=sa;Password=S0rtmypc!"
        Using cn As New SqlConnection(connection)
            cn.Open()
            Using copy As New SqlBulkCopy(cn)
                copy.ColumnMappings.Add(columnCompany, 0)
                copy.ColumnMappings.Add(columnEmail, 1)
                copy.ColumnMappings.Add(columnFirstName, 2)
                copy.ColumnMappings.Add(columnPostCode, 3)
                copy.ColumnMappings.Add(columnTelephone, 4)
                copy.DestinationTableName = "TempSplitReq"
                copy.WriteToServer(dt)
            End Using
        End Using

        Dim SplitConnection As New Data.SqlClient.SqlConnection
        SplitConnection.ConnectionString = "Data Source=DC01\SQLEXPRESS;Initial Catalog=YCM;User ID=sa;Password=S0rtmypc!"
        SplitConnection.Open()
        Dim sqlSplit As String = "TempSplitReq_SaveToMapped"
        Dim commandSplit As New SqlCommand(sqlSplit, SplitConnection)
        commandSplit.ExecuteNonQuery()
        SplitConnection.Close()

    Else

        Dim dt As New DataTable()
        Using con As New OleDbConnection(conString)
            Using cmd As New OleDbCommand()
                Using oda As New OleDbDataAdapter()
                    cmd.CommandText = (Convert.ToString("SELECT * From [") & excelSheet) + "] "
                    cmd.Connection = con
                    con.Open()
                    oda.SelectCommand = cmd
                    oda.Fill(dt)
                    con.Close()
                End Using
            End Using
        End Using

        Dim connection As String = "Data Source=DC01\SQLEXPRESS;Initial Catalog=YCM;User ID=sa;Password=S0rtmypc!"
        Using cn As New SqlConnection(connection)
            cn.Open()
            Using copy As New SqlBulkCopy(cn)
                copy.ColumnMappings.Add(columnCompany, 0)
                copy.ColumnMappings.Add(columnEmail, 1)
                copy.ColumnMappings.Add(columnFirstName, 2)
                copy.ColumnMappings.Add(columnSurname, 3)
                copy.ColumnMappings.Add(columnPostCode, 4)
                copy.ColumnMappings.Add(columnTelephone, 5)
                copy.DestinationTableName = "TempMapped"
                copy.WriteToServer(dt)
            End Using
        End Using

    End If
    MsgBox("Data Mapping Complete")

End Sub

人気のある回答

SqlBulkCopyオブジェクトにはBatchSizeプロパティがあります。私も似たような状況を抱えている

copy.BatchSize = 1000

そして私の作品は大きなスプレッドシートのインポートで動作します。パフォーマンスを向上させるには、このプロパティを環境内で調整します。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ