首页 > 解决方案 > SqlException:将数字转换为数据类型数字的算术溢出错误

问题描述

我正在尝试从 API 中提取加密价格,并使用 dotnet core 3.1(预览版)和 ef core 3 将其保存到我的数据库中。获取数据没有问题,但随后“context.SaveChanges()”会引发“算术溢出错误” ' 例外:

'Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.'

我已经尝试在我的模型中增加小数精度和比例,但我仍然做错了什么,无法找出它是什么。

模型:

    public class PoloniexTradingPair
    {

        // this is the poloniex ID!
        public int Id { get; set; }
        [Key]
        public int PoloniexTradingPairId { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal last { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal lowestAsk { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal highestBid { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal percentChange { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal baseVolume { get; set; }

        [Column(TypeName = "decimal(38,20)")]
        public Decimal quoteVolume { get; set; }

        public int isFrozen { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal high24hr { get; set; }

        [Column(TypeName = "decimal(30,28)")]
        public Decimal low24hr { get; set; }


    }

生成的数据库表:

CREATE TABLE [dbo].[PoloniexTradingPairs](
    [PoloniexTradingPairId] [int] IDENTITY(1,1) NOT NULL,
    [Id] [int] NOT NULL,
    [last] [decimal](30, 28) NOT NULL,
    [lowestAsk] [decimal](30, 28) NOT NULL,
    [highestBid] [decimal](30, 28) NOT NULL,
    [percentChange] [decimal](30, 28) NOT NULL,
    [baseVolume] [decimal](30, 28) NOT NULL,
    [quoteVolume] [decimal](38, 20) NOT NULL,
    [isFrozen] [int] NOT NULL,
    [high24hr] [decimal](30, 28) NOT NULL,
    [low24hr] [decimal](30, 28) NOT NULL,
 CONSTRAINT [PK_PoloniexTradingPairs] PRIMARY KEY CLUSTERED 
(
    [PoloniexTradingPairId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

方法:


void getPoloniexTradingPairs()
{
    using (ApplicationDbContext context = new ApplicationDbContext())
    {


        using (var httpClient = new HttpClient())
        {


            var rates = httpClient.GetStringAsync("https://poloniex.com/public?command=returnTicker");
            JObject rates_json = JObject.Parse(rates.Result);
            // Log.Information(rates_json.ToString());

            foreach (var tradingpair in rates_json)
            {
                Log.Information(tradingpair.Key);
                PoloniexTradingPair pair = JsonConvert.DeserializeObject<PoloniexTradingPair>(tradingpair.Value.ToString());
                Log.Information("logging pair");
                Log.Information(JsonConvert.SerializeObject(pair).ToString());
                context.Add(pair);

                Log.Information(pair.highestBid.ToString());

            }

            context.SaveChanges();



            /*
                JObject rates_json2 = JObject.Parse(rates_json.First.First.Last.First.ToString());
                string rates_json3 = rates_json.First.First.First.Last.ToString();
                CB_ExchangeRates ExchangeRates = JsonConvert.DeserializeObject<CB_ExchangeRates>(rates_json.First.First.Last.First.ToString());
                ExchangeRates.currency = rates_json3;

                context.Add(ExchangeRates);
                context.SaveChanges();
                Log.Information(JsonConvert.SerializeObject(ExchangeRates));
                Log.Information("success!");
            */


            /*
            Log.Information("Pulling coinbase for exchange rates...");
            var json = httpClient.GetStringAsync("https://api.coinbase.com/v2/prices/BTC-EUR/buy");

            JObject jobject = JObject.Parse(json.Result);


            CB_BTCEUR btceur = new CB_BTCEUR { Basecurrency = (string)jobject["data"]["base"], Targetcurrency = (string)jobject["data"]["currency"], Amount = (string)jobject["data"]["amount"] };
            */


        }
    }
}

在运行时,pair 看起来像预期的那样:

    Id  7   int
    PoloniexTradingPairId   0   int
    baseVolume  0.70627038  decimal
    high24hr    0.00000005  decimal
    highestBid  0.00000004  decimal
    isFrozen    0   int
    last    0.00000004  decimal
    low24hr 0.00000004  decimal
    lowestAsk   0.00000005  decimal
    percentChange   0.00000000  decimal
    quoteVolume 17019678.54214583   decimal

我不知道如何找出真正导致问题的值,并且在异常中找不到任何信息,除了:“第 3 行”。我假设它指的是 SQL 查询,有没有办法查看查询?数据库似乎反映了我的模型,但还是有问题。

感谢您提供解决此问题的任何提示!:)

标签: c#sql-server.net-coreentity-framework-coreef-code-first

解决方案


推荐阅读