如何将61000个数据对象插入到sql server 2005中?

问题描述:

我试图通过远程调用将61,000多个对象以尽可能最快的方式插入到SQL Server 2005数据库中。有什么建议么?如何将61000个数据对象插入到sql server 2005中?

我已经看过使用SQLBulkCopy,但是我遇到了一些问题,因为我没有以DataTable开始,而是有对象列表,所以如何将数据转换为正确格式时遇到了一些问题。所以如果答案可能包含代码示例,将不胜感激。

我想在处理它之前将数据插入到临时表中以保持内存使用量不变。

编辑...

@JP - 这是后话,每天晚上将运行与IIS ASP.NET应用程序计划的批处理作业。

谢谢。

如果这是你正在做一次或只是周期性的,你应该看看使用SSIS(它基本上是类固醇上的DTS)。你可以构建一个从一个数据源获取数据并将其插入另一个数据源的包。还有停止/启动和迁移跟踪功能。没有关于您的情况的更多细节,我无法提供代码,但SSIS上有很多代码示例。您可以通过Virtual Labs了解更多信息并使用SSIS。

如果您打算使用SQLBulkCopy class我建议您创建一个实现IDataReader的自定义类,它将负责将61000个源数据对象映射到目标表中的相应列,然后将此自定义类用作参数添加到SQLBulkCopy WriteToServer方法。

唯一棘手部分将在您的类中实现IDataReader接口。但即使这样也不会太复杂。请记住,您的目标是让此类将您的610000数据对象映射到列名称。而且你的类将被SQLBulkCopy类调用来提供数据。其余的应该很容易地聚到一起。

class CustomReaderClass : IDataReader 
{ 
    // make sure to implement the IDataReader inferface in this class 

    // and a method to load the 61 000 data objects 
    void Load() 
    { 
     // do whatever you have to do here to load the data.. 
     // with the remote call..?! 
    } 
} 

//.. later you use it like so 

SQLBulkCopy bulkCopyInstance; 
CustomReaderClass aCustomReaderClass = new aCustomReaderClass(); 
aCustomReaderClass.Load(); 

// open destination connection 
// .. and create a new instance of SQLBulkCopy with the dest connection 
bulkCopyInstance.WriteToServer(aCustomReaderClass); 

// close connection and you're done! 

我希望上面的“伪代码”有一定的道理..

@Miky d有正确的方法,但我想扩大的细节。实现IDataReader并不那么困难。

要获得的IDataReader使用批量插入你应该看看落实工作:

  • 的Dispose();
  • FieldCount {
  • object GetValue(int i);
  • GetSchemaTable();
  • Read();

其余的都可以抛出NotImplementedExceptions存根,see this sample

获取模式表格也pretty easy。只需从目标表中选择一行并调用GetSchemaTable()。

为了保持更清晰的东西,我喜欢在非必要的方法上引入NotImplementedException的抽象类,或许在抽象类可以实现缺少的位以增加健壮性的线下。

这种方法的几个BIG注意事项:

  1. 哪些方法来实现不SqlBulkCopy的
  2. 记录随着为追随,在最新版本的框架/修补程序或服务包可能会破坏你。所以如果我有任务关键代码,我会咬一口并实现整个界面。

我认为,它很可怜的是SqlBulkCopy的不具有批量插入数据的附加最小接口,IDataReader的是方式为脂肪。