SqlBulkCopy并没有复制列中的所有数据
我遇到了一个问题,SqlBulkCopy没有将列中的所有数据复制到目标表。我已经验证了作为.CSV文件的源数据在所有行的列中都有值,但只有该列的前40行左右被复制 目标表的列被设置为NVARCHAR255,并且所有列都允许为空 以下是我执行批量复制的功能: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
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文件。谢谢如果你改变主意,你可以删除你的答案。