我正在寻找关于根据对象集合将大量记录插入数据库(SQL2000以后)的最佳方法的任何建议。
目前我的代码看起来类似于下面的代码片段,并且使用单个sql简单INSERT命令插入每个记录(每次调用函数时打开和关闭数据库连接! - 我确定这必须减慢速度? )。
例程需要能够应对常规插入多达100,000条记录,我想知道是否有更快的方式(我确定必须有???)。我已经看到一些帖子提到使用基于xml的数据和批量复制例程 - 这是我应该考虑的事情,还是任何人都可以提供我可以构建的任何简单示例?
foreach (DictionaryEntry de in objectList)
{
eRecord record = (eRecord)de.Value;
if (!record.Deleted)
{
createDBRecord(record.Id,
record.Index,
record.Name,
record.Value);
}
}
感谢您的任何建议,
保罗。
答案 0 :(得分:2)
这样做会相对缓慢。您需要考虑使用BCP或BULK INSERT的批量INSERT技术,或者如果您使用的是.NET 2.0,则可以使用SqlBulkCopy class。以下是使用SqlBulkCopy的示例:SqlBulkCopy - Copy Table Data Between SQL Servers at High Speeds
以下是SQL Server 2000的一个简单示例:
如果您有CSV文件csvtest.txt,则采用以下格式:
1,约翰史密斯
2,鲍勃,希望
3,凯特,居里
4,彼得,绿
这个SQL脚本会将csv文件的内容加载到数据库表中(如果任何行包含错误,它将不会被插入但其他行将是):
USE myDB
GO
CREATE TABLE CSVTest
(
ID INT,
FirstName VARCHAR(60),
LastName VARCHAR(60)
)
GO
BULK INSERT
CSVTest
FROM 'c:\temp\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
SELECT *
FROM CSVTest
GO
您可以将字典内容写入CSV文件,然后BULK INERT该文件。
另请参阅:Using bcp and BULK INSERT
如果您实现自己的IDataReader方法,则可以避免写入中间文件。见ADO.NET 2.0 Tutorial : SqlBulkCopy Revisited for Transferring Data at High Speeds
相关问题:how to pass variables like arrays / datatable to SQL server?