2009-07-08 93 views
0

我試圖通過遠程調用將61,000多個對象以儘可能最快的方式插入到SQL Server 2005數據庫中。有什麼建議麼?如何將61000個數據對象插入到sql server 2005中?

我已經看過使用SQLBulkCopy,但是我遇到了一些問題,因爲我沒有以DataTable開始,而是有對象列表,所以如何將數據轉換爲正確格式時遇到了一些問題。所以如果答案可能包含代碼示例,將不勝感激。

我想在處理它之前將數據插入到臨時表中以保持內存使用量不變。

編輯...

@JP - 這是後話,每天晚上將運行與IIS ASP.NET應用程序計劃的批處理作業。

謝謝。

回答

2

如果這是你正在做一次或只是週期性的,你應該看看使用SSIS(它基本上是類固醇上的DTS)。你可以構建一個從一個數據源獲取數據並將其插入另一個數據源的包。還有停止/啓動和遷移跟蹤功能。沒有關於您的情況的更多細節,我無法提供代碼,但SSIS上有很多代碼示例。您可以通過Virtual Labs瞭解更多信息並使用SSIS。

1

如果您打算使用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! 

我希望上面的「僞代碼」有一定的道理..

0

@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的是方式爲脂肪。

相關問題