我刚刚发现,当您使用
DataTable
和 SqlBulkCopy
尝试加载 SQL Server 表时,不能使用大的十进制值。
DataTable
仅支持 .NET decimal
类型。 .NET decimal
比 SQL Server decimal
小,因此当超出 .NET 范围时,会出现异常。
我准备了一个
DataTable
,其中包含带有 SqlDecimal
列的数据行,并尝试批量加载它。
bulkCopy.WriteToServer(dt);
但我收到此错误:
InvalidCastException:无法将参数值从 SqlDecimal 转换为 Decimal。
这个问题有解决办法吗?
我无法重现。
using System.Data.SqlClient;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Data.SqlTypes;
using var con = new SqlConnection("server=localhost;database=tempdb;integrated security=true;TrustServerCertificate=true");
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = "drop table if exists foo; create table foo(id int, d decimal(38,2))";
cmd.ExecuteNonQuery();
var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("d", typeof(SqlDecimal));
var d = SqlDecimal.Parse("123456789012345678901234567890123456.78");
dt.Rows.Add(1, d);
var bc = new SqlBulkCopy(con);
bc.DestinationTableName = "foo";
bc.WriteToServer(dt);