2017-11-17 85 views
0

我已經實現了一個使用IDataReader的類作爲使用SqlBulkCopy的項目的一部分。我已經發布了一些相關的代碼在這裏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); 

當運行在WriteToServer方法,我發現到的GetValue()首先調用開頭索引值爲1,索引的最終值比列數小1。由於這個問題,批量加載最終會跳過一列。

我無法找到爲什麼GetValue()中的索引沒有將值從1遞增到列數。實際上,這個值應該從0開始並且比列數少一個。請讓我知道是否有人幫我找到原因。

回答

0

您不指定映射。因此默認SqlBulkCopy可能會嘗試按數據庫的順序自動映射。

舉例來說,如果數據庫中的第一列是一個標識列(這很有可能成爲這種情況),它將跳過index 0,並以index 1開頭。

+1

太棒了!這是原因。我刪除了標識列來驗證,現在索引值從0開始並遍歷所有列。我添加了一個列映射,以避免讓SqlBulkCopy做猜測工作。 – wired2code