我们有一个遗留应用程序将大量数据转储到制表符分隔的文件中。每个文件都包含一个记录类型,并且所有字段都是固定长度的。
这些文件可以很容易地从命令行使用 BCP 实用程序导入到我们的 SQL 服务器数据库中的相应表中。我们有一个用 VS 2003 编写的 VB.Net 程序,它使用 SQLDMO.BulkCopy 例程导入这些文件。
我们正在更新系统以将 VS 2010 与 SQL Server 2008 一起使用,并且根据 Microsoft 文档,SQLDMO 不再可用。
我在互联网上搜索并重写了导入例程,以使用 Microsoft.Jet.OLEDB.4.0 提供程序将制表符分隔的文件导入 DataTable。然后使用 SqlClient.BulkCopy 对象导入此 DataTable。我遇到的这个问题是制表符分隔文件中设置为空格的字段在导入 DataTable 时被视为 NULL。当 SqlClient.BulkCopy 处理 DataTable 时,复制失败,因为空值被定义为 NOT NULL 的 SQL 表字段拒绝。
正在测试的代码如下所示
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim data As DataTable = RetrieveSourceData()
CopyData(data)
End Sub
Private Function RetrieveSourceData() As DataTable
Dim connstring As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\temp\;Extended Properties='text;HDR=No;FMT=TabDelimited'"
Dim sourcedata As New DataTable
Using conn As New OleDb.OleDbConnection(connstring)
conn.Open()
Dim command As New OleDb.OleDbCommand("Select * from X1.CSV", conn)
Dim adapter As New OleDb.OleDbDataAdapter(command)
adapter.Fill(sourcedata)
conn.Close()
End Using
Return sourcedata
End Function
Private Sub CopyData(SourceData As DataTable)
Dim dbConnString As String = "Data Source=(local);Initial Catalog=XtractDB;User ID=xxxx;Password=yyyy;"
Using bcp As New SqlClient.SqlBulkCopy(dbConnString)
bcp.DestinationTableName = "X1"
bcp.BatchSize = 1000
bcp.WriteToServer(SourceData)
End Using
End Sub
为了让输入文件被识别为 TabDelimited,我必须在与输入文件相同的目录中创建一个 schema.ini 文件。内容如下图
[X1.CSV]
Format=TabDelimited
在创建 DataTable 时,有什么方法可以强制带空格的字段不被视为 NULL?
这是通过 VB.Net 程序处理批量复制的最佳方法吗?
TIA,
安迪
保存到:默认
切换颜色主题
选择消息背景颜色...
选择消息区域宽度...
调整消息文本字体大小...
禁用自动链接 启用首字母缩略词 禁用消息标题 启用自动引用 更新此线程的标题...
SQL 批量复制线程# 1544244 消息 #1544244