从哈希表中将记录插入数据库

时间:2010-01-08 00:52:49

标签: c# database ado.net

我正在寻找关于根据对象集合将大量记录插入数据库(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);
  }
}

感谢您的任何建议,

保罗。

1 个答案:

答案 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?