【发布时间】:2009-10-07 10:53:58
【问题描述】:
我在数据库中有一个已经有 100 条记录的表。现在我必须再插入 100 条记录。现在我们必须使用哪个对象?是dataadapter还是sqlbulkcopy?
【问题讨论】:
标签: ado.net bulkinsert
我在数据库中有一个已经有 100 条记录的表。现在我必须再插入 100 条记录。现在我们必须使用哪个对象?是dataadapter还是sqlbulkcopy?
【问题讨论】:
标签: ado.net bulkinsert
如果底层 ADO.Net 提供程序支持 SQL 批处理,您可以使用 DataAdapter。如果您使用的是 SQL 服务器,则可以使用 SqlBulkCopy。 SqlBulkCopy 具有速度优势,只要您可以直接将数据插入数据库,但仅适用于 SQL Server。如果您需要使用自定义插入、存储过程或其他数据提供程序,则需要使用 DataAdapter。默认情况下,DataAdapter 上的 .Update 方法确实以批处理模式运行,一次将许多记录发送到数据库是在服务器上插入而不是在客户端上一次循环一条记录。
请记住,某些提供商根本不支持批处理模式。
对于加载数据,您还可以查看SQL Server Intergration Services (SSIS)
编辑:
anishmarokey 也提出了一个很好的观点。对于处理 100 条记录,如何插入并不重要。即使循环记录并执行自定义 SQL INSERT 也会运行得相当快。
【讨论】:
我认为不需要sqlbulkcopy。 sqlbulkcopy 是插入批量(百万)数据。
注意:sqlbulkcopy - .NET Framework 和 .NET Compact Framework 并不支持每个平台的所有版本
【讨论】:
我将假设两件事:您正在使用 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
请注意,如果您有一个身份字段,您必须在插入中明确包含字段列表,否则您不必这样做。
【讨论】: