According to the original source, it SqlBulkCopyalways truncates decimal values instead of rounding, which, unfortunately, differs from the behavior of the BULK INSERT statement.
ConvertValue TdsParser.AdjustSqlDecimalScale :
switch(type.NullableType) {
case TdsEnums.SQLNUMERICN:
case TdsEnums.SQLDECIMALN:
if (sqlValue.Scale != metadata.scale) {
sqlValue = TdsParser.AdjustSqlDecimalScale(sqlValue, metadata.scale);
}
AdjustSqlDecimalScale SqlDecimal.AdjustScale, false fRound:
static internal SqlDecimal AdjustSqlDecimalScale(SqlDecimal d, int newScale) {
if (d.Scale != newScale) {
return SqlDecimal.AdjustScale(d, newScale - d.Scale, false );
}
return d;
}
-, true AdjustScale, , SqlBulkCopy, DataTable WriteToServer.
BULK INSERT , SqlBulkCopy.