DataTable 和大 SqlDecimal

问题描述 投票:0回答:1

我刚刚发现,当您使用

DataTable
SqlBulkCopy
尝试加载 SQL Server 表时,不能使用大的十进制值。

DataTable
仅支持 .NET
decimal
类型。 .NET
decimal
比 SQL Server
decimal
小,因此当超出 .NET 范围时,会出现异常。

我准备了一个

DataTable
,其中包含带有
SqlDecimal
列的数据行,并尝试批量加载它。

bulkCopy.WriteToServer(dt);

但我收到此错误:

InvalidCastException:无法将参数值从 SqlDecimal 转换为 Decimal。

这个问题有解决办法吗?

c# sql-server ado.net decimal sqlbulkcopy
1个回答
0
投票

我无法重现。

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);
© www.soinside.com 2019 - 2024. All rights reserved.