2017-11-17 18 views
0

SqlBulkCopyを使用するプロジェクトの一部としてIDataReaderを使用してクラスを実装しました。 WriteToServerメソッドが実行されると、私はここに関連するコードの一部IDataReader実装のインデックス値の問題

public bool Read() 
{ 
    var result = !fileStream.EndOfStream; 
    if (result) 
    { 
     delimRow = fileStream.ReadLine();  
     splitRowValues = delimRow.Split(_delimiters); 
     readRowCount++; 
    }  
    return result; 
} 

private string[] Row 
{ 
    get { return splitRowValues; } 
} 

public object GetValue(int i) 
{ 
    return Row[i]; 
} 

コードSqlBulkCopyを使用してスニペットとのIDataReader

SqlBulkCopy bulkInsert = new SqlBulkCopy(Constants.DBConnection, SqlBulkCopyOptions.UseInternalTransaction); 
bulkInsert.BatchSize = 500; 
bulkInsert.DestinationTableName = Constants.DestinationTable; 
bulkInsert.WriteToServer(reader); 

を掲載している、私はGetValueメソッドの最初の呼び出しは、()で始まることに気づきました索引値は1で、索引の最終値は列数よりも1少ない値になります。この問題のため、バルクロードは1つの列をスキップします。

GetValue()のインデックスが1から列カウントまでの値を取らない理由を見つけることができません。実際には、値は0から開始し、列カウントよりも1つ少なくなるはずです。誰かが原因を見つけるのを手伝ってくれたら教えてください。

答えて

0

マッピングを指定しません。したがって、デフォルトでSqlBulkCopyは、データベースとの序数による自動マッピングを試みる可能性があります。

例として、データベースの最初の列がID列(大文字となる可能性が高い)の場合は、index 0をスキップして、代わりにindex 1で開始します。

+1

恐ろしい!それが理由だった。検証するためにID列を削除したところ、インデックス値は0から始まり、すべての列を通過します。私は、SqlBulkCopyがその推測の仕事をすることを避けるために列のマッピングを追加しました。 – wired2code