我在数据库中有一个已经有 100 条记录的表。现在我必须再插入 100 条记录。现在我们必须使用哪个对象?无论是dataadapter还是sqlbulkcopy?
3 回答
如果底层 ADO.Net 提供程序支持 SQL 批处理,您可以使用DataAdapter。如果您使用的是 SQL 服务器,则可以使用SqlBulkCopy。SqlBulkCopy 具有速度优势,只要您可以直接将数据插入数据库,但仅适用于 SQL Server。如果您需要使用自定义插入、存储过程或其他数据提供程序,则需要使用 DataAdapter。默认情况下,DataAdapter 上的.Update方法确实以批处理模式运行,一次将许多记录发送到数据库是在服务器上进行插入,而不是在客户端一次循环一个记录。
请记住,某些提供程序并不完全支持批处理模式。
此外,对于加载数据,您还可以查看SQL Server 集成服务 (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
请注意,如果您有一个身份字段,您必须在插入中明确包含字段列表,否则您不必这样做。