我在数据库中有一个表已有100条记录。现在我必须再插入100条记录。现在我们要使用哪个对象?是dataadapter还是sqlbulkcopy?
答案 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
请注意,如果您有一个标识字段,则必须在插入中明确包含字段列表,否则不必执行此操作。