使用SQLBulkCopy导入数据

时间:2012-05-25 07:12:46

标签: vb.net sqlbulkcopy

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

可以使用命令行中的BCP实用程序将这些文件轻松导入到SQL Server数据库中的相应表中。 我们有一个用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

1 个答案:

答案 0 :(得分:0)

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

Refer this link for verification

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

BULK
INSERT Tablename
FROM 'c:\csvtest.txt'
WITH
(
    FIELDTERMINATOR = ','
    ,ROWTERMINATOR = '\n'
    --,FIRSTROW = 2
    --,MAXERRORS = 0
)
GO