我们有一个遗留应用程序,它将大量数据转储到制表符分隔文件。每个文件包含一个记录类型,所有字段都是固定长度。
可以使用命令行中的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
答案 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