SqlBulkCopyは、列内のすべてのデータをコピーしていません

.net sql sqlbulkcopy vb.net visual-studio-2012

質問

私は、 SqlBulkCopyが列内のすべてのデータを宛先テーブルにコピーしていないという問題がSqlBulkCopyています。私は、ソースデータ( .CSVファイル)がすべての行の列に値を持っていることを確認しましたが、その列の最初の40行だけがコピーされています。

宛先テーブルの列はNVARCHAR(255)設定され、それらのすべてはNULL可能にすることができます。

一括コピーを実行する機能は次のとおりです。

Private Sub loadDataFromCSV(ByVal pathToFile As String, ByVal connString As String, ByVal file As String, ByVal colCount As Integer)
        Dim fileLocation As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & pathToFile & ";Extended Properties='text;HDR=NO;FMT=Delimited(,)';"
        Dim qry As String = "select * from " & file
        Dim CompData As OleDbDataReader
        Using destConnection As SqlConnection = _
           New SqlConnection(connString)
           destConnection.Open()

            Using sourceConnection As New OleDbConnection(fileLocation)
                Dim cmdSourceData As New OleDbCommand(qry, sourceConnection)
                sourceConnection.Open()
                CompData = cmdSourceData.ExecuteReader()

                Using bulkCopy As SqlClient.SqlBulkCopy = New SqlClient.SqlBulkCopy(connString)
                    bulkCopy.DestinationTableName = "dbo.Records"
                    bulkCopy.BatchSize = 10000
                    bulkCopy.BulkCopyTimeout = 90

                    Try
                        bulkCopy.WriteToServer(CompData)

                    Catch ex As Exception
                        Console.WriteLine(ex.Message)

                    Finally
                        CompData.Close()
                    End Try
                End Using
            End Using
        End Using
    End Sub

私が知る限り、テーブルのすべてのデータは、7番目の列を除いて、正しい列に上書きされています。 7番目の列では、最初の40行程度のデータが取得され、残りの列の値はNULLになります。

私は何がうまくいかないのかというアイデアがなくなり、どんな助けにも大いに感謝しています。

ありがとう。

受け入れられた回答

私の推測では、それは変換誤りです。 OLEDBは、最初の8行に基づいて列のデータ型を推論します(私は考える)ので、最初の行は次のとおりです。

SomeColumn
----------
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apple

これは最初は整数列のように見えますが、これはマップされているものですが、 "apple"になると整数に変換できないので、DbNullを返します。

これに対する解決策は、接続文字列にIMEX=1を追加することです。これは暗黙の変換が行われないことを意味し、OleDbReaderはcsvにあるものを正確に読み込みます。

これの欠点は、 SqlBulkCopy.WriteToServer(DataReader)メソッドをSqlBulkCopy.WriteToServer(DataReader)うとすると変換エラーが発生する可能性があることです。データベーステーブルと同じ形式のDataTableを作成し、必要に応じて明示的な変換を実行してOleDbReaderを反復処理し、このDataTableをSqlBulkCopyでデータベースに書き込む必要があります。



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