c# - 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 查询,有没有办法查看查询?数据库似乎反映了我的模型,但还是有问题。
感谢您提供解决此问题的任何提示!:)
解决方案
推荐阅读
- flutter - 颤振 - 将固定标题添加到 SliverList
- nginx - 在命名空间中将 nginx Web 服务器作为单独的 pod 运行
- java - 如何将 if 语句放在 if-else if 语句中
- javascript - 我想使用 ffmpeg 映射两个视频,例如在 nodejs 中的第一个视频上覆盖第二个视频
- angular - 用户输入数字时重复输入类型文件
- java - 在 java GraphX 中运行 PartitionStrategy 后有没有办法生成子图?
- visual-studio-code - 用于最大化 vscode 中的资源管理器(或侧边栏)的命令 ID?
- css - 在 Reactjs 中,如何为这个模板设置响应视图?
- android - 如何在compose中观察livedata?
- tensorflow - TRT 与 TF-TRT