如何使用ado.net 3.5批量插入现有数据库表

时间:2009-10-07 10:53:59

标签: ado.net bulkinsert

我在数据库中有一个表已有100条记录。现在我必须再插入100条记录。现在我们要使用哪个对象?是dataadapter还是sqlbulkcopy?

3 个答案:

答案 0 :(得分:4)

如果底层ADO.Net提供程序支持SQL批处理,则可以使用DataAdapter。如果您使用的是SQL Server,则可以使用SqlBulkCopy。只要您可以直接将数据插入数据库但只能与SQL Server一起使用,SqlBulkCopy具有速度优势。如果需要使用自定义插入,存储过程或其他数据提供程序,则需要使用DataAdapter。默认情况下,DataAdapter上的.Update方法以批处理方式运行,一次将许多记录发送到数据库是服务器上的插入,而不是在客户端上一次循环记录。

请记住,有些提供商并不支持批处理模式。

同样,对于加载数据,您还可以查看SQL Server Intergration Services (SSIS)

修改

anishmarokey也提出了一个非常好的观点。对于处理100条记录,插入的方式并不重要。即使循环记录并执行自定义SQL INSERT也会运行得相当快。

答案 1 :(得分:3)

我认为不需要sqlbulkcopy。 sqlbulkcopy用于插入批量(数百万)数据。

注意:sqlbulkcopy - .NET Framework和.NET Compact Framework不支持每个平台的所有版本

答案 2 :(得分:1)

我将假设两件事:您正在使用SQL Server,而您正在从外部文件插入记录。以下是您需要的T-SQL代码示例 - 它非常简单(在Mgmnt Studio的SQL提示窗口中输入):

BULK INSERT TableName
        FROM 'C:\SomeDirectory\SomeFile.txt'
            WITH
    (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\n'
    )
GO

无论是100条记录还是100万条,这都很容易,当您想从CSV文件导入时,没有理由使用批量插入。如果CSV与您的表结构不匹配,那么(我所做的)创建一个临时表,执行导入,然后使用INSERT(如下所示)从临时表复制到目标表,只选择您需要的字段或顺序。

以防万一 - 如果您从另一个表或查询中插入100多条记录,则语法为:

Insert Into [dbName].[dbo].[TableName]
  Select Field1, Field2...FieldN From OtherTableName Where {Some conditions}

如果您的插入内容包含“身份”字段,则为:

Set IDENTITY_INSERT TableName ON
GO

Insert Into [dbName].[dbo].[TableName] (Field1, Field2...FieldN)
  Select Field1, Field2...FieldN From OtherTableName Where {Some conditions}
GO

Set IDENTITY_INSERT TableName OFF
GO

请注意,如果您有一个标识字段,则必须在插入中明确包含字段列表,否则不必执行此操作。