1

我们有一个遗留应用程序将大量数据转储到制表符分隔的文件中。每个文件都包含一个记录类型,并且所有字段都是固定长度的。

这些文件可以很容易地从命令行使用 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

4

1 回答 1

0

SqlDMO 在 Sql server 2012 中已弃用,但在 Sqlserver 2008 R2 版本之前可用。SqlBulkCopy 在 4.5 之前的所有 .net 框架中都可用,除了 1.1。

请参考此链接进行验证

您可以使用 BULK INSERT(命令行实用程序)一次插入多条记录。

BULK
INSERT Tablename
FROM 'c:\csvtest.txt'
WITH
(
    FIELDTERMINATOR = ','
    ,ROWTERMINATOR = '\n'
    --,FIRSTROW = 2
    --,MAXERRORS = 0
)
GO
于 2012-05-25T07:19:07.717 回答