2016-08-11 11 views
0

私はSqlBulkCopyを使用してCSVから約66k行をインポートしています。 CSVはDataTableにインポートされ、以下の以下のメソッドに渡されます。SqlBulkCopyはDataTableより多くの行を作成します

データベースに無期限に同じ行をレプリケートする(または終わりに達するとリセットする)ようです。デバッグは約30分間実行され、DataTableの各行を約5回複製する350kレコードに近いものを作成しました。

私はDataTableの行の量が正しいことを確認できますので、私は何か、何らかのアイデアが欠落している必要がありますか?

注:私はs.BatchSizeを追加しました。これは、大文字小文字ではない量だけをインポートすることを希望しています。

/* 
    * StoreImportedData() 
    * This method will store all of the imported data from the datatable to the SQL server database. 
    * 
    * 
    */ 

    private Boolean StoreImportedData(DataTable csvFileData) 
    { 
     try 
     { 
      using (SqlConnection dbConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString)) 
      { 
       dbConnection.Open(); 
       using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) 
       { 
        s.DestinationTableName = "Staging"; 
        // Amount of rows to issue in the batch: (currently value is around 60k) 
        s.BatchSize = csvFileData.Rows.Count; 
        s.ColumnMappings.Add("remark", "ReportDate"); 
        s.ColumnMappings.Add("ipAddress", "IPAddress"); 
        s.ColumnMappings.Add("hostName", "HostName"); 
        s.ColumnMappings.Add("macAddress", "MacAddress"); 
        s.ColumnMappings.Add("deviceName", "PrinterName"); 
        s.ColumnMappings.Add("comment", "CenterCode"); 
        s.ColumnMappings.Add("userName", "CustomerCode"); 
        s.ColumnMappings.Add("userDisplayName", "CustomerName"); 
        s.ColumnMappings.Add("printerBlackTotal", "TPrintBw"); 
        s.ColumnMappings.Add("printerColorTotal", "TPrintCol"); 
        s.ColumnMappings.Add("copyBlackTotal", "TCopyBw"); 
        s.ColumnMappings.Add("copyColorTotal", "TCopyCol"); 
        s.ColumnMappings.Add("scanTotal", "TScan"); 
        s.ColumnMappings.Add("faxBlackTotal", "TFaxBw"); 
        s.WriteToServer(csvFileData); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw new Exception("An error has occured with the import SQL operation: " + e.Message); 
     } 
     return true; 
    } 
} 
+0

あなたがステージングテーブルに一意のインデックスまたは主キーを持っていますか? –

+0

はい自動増分するプライマリ・キー(Id)があります – mauzilla

+0

複数の挿入を防ぐために一意の索引を表に追加するのが私の推測ですが、自動増分である主キーはそれを助けません。 –

答えて

0

これを試してみてください:

s.WriteToServer(csvFileData.CreateDataReader()); 
+0

例外があります:入力配列がこのテーブルの列数よりも長いです。 – mauzilla

+0

これは上記の列よりも多くの列があることを意味します。 – jonju

+0

それは正しいです、私はマッピングが残りの行を無視すると思った。マッピングで設定された行だけを使用するように設定する方法はありますか? – mauzilla

関連する問題