Kei*_*son 5 c# sql database sql-server datatable
当我使用批量复制从C#DataTable向Sql Server 2005插入十进制值时,值被截断而不是舍入.
我正在使用的代码非常简单:
var bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, null) { DestinationTableName = tableName};
bulkCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这一问题?
Mic*_*Liu 10
根据引用源,SqlBulkCopy
总是截断十进制值而不是舍入,这不幸地与BULK INSERT语句的行为不同.
如果源值的比例与目标列的比例不同,则私有ConvertValue
方法调用TdsParser.AdjustSqlDecimalScale
:
switch(type.NullableType) {
case TdsEnums.SQLNUMERICN:
case TdsEnums.SQLDECIMALN:
// ...
if (sqlValue.Scale != metadata.scale) {
sqlValue = TdsParser.AdjustSqlDecimalScale(sqlValue, metadata.scale);
}
Run Code Online (Sandbox Code Playgroud)
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 /* Don't round, truncate. MDAC 69229 */);
}
return d;
}
Run Code Online (Sandbox Code Playgroud)
显然没有办法覆盖这种行为并传递true
给AdjustScale
,所以如果你想使用SqlBulkCopy
,你需要DataTable
在调用之前对自己的值进行舍入WriteToServer
.
或者,您可以将数据写入文件并直接执行BULK INSERT SqlBulkCopy
.
归档时间: |
|
查看次数: |
2803 次 |
最近记录: |