SqlBulkCopy并没有复制列中的所有数据

SqlBulkCopy并没有复制列中的所有数据,sql,.net,vb.net,visual-studio-2012,sqlbulkcopy,Sql,.net,Vb.net,Visual Studio 2012,Sqlbulkcopy,我遇到了一个问题,SqlBulkCopy没有将列中的所有数据复制到目标表。我已经验证了作为.CSV文件的源数据在所有行的列中都有值,但只有该列的前40行左右被复制 目标表的列被设置为NVARCHAR255,并且所有列都允许为空 以下是我执行批量复制的功能: Private Sub loadDataFromCSV(ByVal pathToFile As String, ByVal connString As String, ByVal file As String, ByVal colCount

我遇到了一个问题,SqlBulkCopy没有将列中的所有数据复制到目标表。我已经验证了作为.CSV文件的源数据在所有行的列中都有值,但只有该列的前40行左右被复制

目标表的列被设置为NVARCHAR255,并且所有列都允许为空

以下是我执行批量复制的功能:

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

对于可能出现的问题,我已经没有什么想法了,因此,如果有任何帮助,我将不胜感激


谢谢。

我猜是转换错误。如果您的第一行是:

SomeColumn
----------
    1
    2
    3
    4
    5
    6
    7
    8
    9
    apple
这最初看起来像一个整数列,所以这是它映射到的,但当它到达apple时,它无法将其转换为整数,因此返回DbNull

解决方法是将IMEX=1添加到连接字符串中,这意味着不会进行隐式转换,OleDbReader只会准确读取csv中的内容


这样做的缺点是,在尝试调用SqlBulkCopy.WriteToServerDataReader方法时,可能会出现转换错误。您可能需要以与数据库表相同的格式创建一个数据表,并在必要时在OleDbReader上进行显式转换,然后使用SqlBulkCopy将此数据表写入数据库。

作为一种常见的解决方法,我只需在csv文件前8行的每一列中插入一个字符串。它愚弄了sqlbulkcopy,使其将所有字段都视为字符串。然后在sql中删除包含字符串的记录。

您是否尝试仅复制一列?是的,当我尝试仅复制第7列时,我会得到前40行左右的行,然后为其余列的行设置为空。这确实是一个混合数据类型的列。我将源的连接字符串更改为包含IMEX=1,但仍然得到相同的结果。因此这并不是我所需要的,但它让我找到了正确的答案。事实证明,通过包含Schema.ini文件,我能够正确解析CSV文件。谢谢如果你改变主意,你可以删除你的答案。