如何将 C# BigInteger 转换为 MySQL DECIMAL(36,18)?

Posted

技术标签:

【中文标题】如何将 C# BigInteger 转换为 MySQL DECIMAL(36,18)?【英文标题】:How do I convert a C# BigInteger into a MySQL DECIMAL(36,18)? 【发布时间】:2021-12-10 07:06:05 【问题描述】:

我正在尝试将 BigInteger 存储为 C# 中的 DECIMAL(36,18)。 当我尝试添加这样的值时:

public void AddTrade(BigInteger price) 
    _connection.Open();
    var command = new mysqlCommand(@"INSERT INTO Prices (Price) VALUES (@Price);", _connection);
    command.Parameters.Add("@Price", MySqlDbType.Decimal).Value = price;
    command.ExecuteNonQuery();
    _connection.Close();

我得到以下异常:

System.NotSupportedException: 'Parameter type BigInteger is not supported; 

这是我创建表格的方式:

public void CreatePriceTable() 
    _connection.Open();
    var createTable = new MySqlCommand(
        @"
        CREATE TABLE `Prices` (
        Price DECIMAL(36,18) NOT NULL,
        ) COLLATE='utf8_general_ci' ENGINE=InnoDB;"
        , _connection);
    createTable.ExecuteNonQuery();
    _connection.Close();

我无法在任何文档中找到解决方案,希望有人可以帮助我。谢谢!

编辑: 我需要使用 BigInteger 的原因是因为我收到了一个以 Wei(以太坊区块链上的最小单位)为 BigInteger 的价格。一个以太币是 1000000000000000000 Wei。其他posts 建议为 Wei 使用 DECIMAL(36,18)。

【问题讨论】:

你可以直接将价格转换成双倍 这能回答你的问题吗? Fastest way to convert a BigInteger to a decimal (Base 10) string? 它很可能期望 C# 'decimal' 类型用于“DECIMAL”类型的列。不是BigInteger。 BigInteger 具有无限精度,一般情况下无论如何都不能存储在“DECIMAL”列中。 BigInteger 在 c# 中不存在,因为数据类型将它向下转换为 int32。但我不明白你为什么要将整数转换为小数 DECIMAL(36,0) 可能更有意义 【参考方案1】:

解决方案比预期的要简单得多。调用 ToString() 就可以了:

public void AddTrade(BigInteger price) 
    _connection.Open();
    var command = new MySqlCommand(@"INSERT INTO Prices (Price) VALUES (@Price);", _connection);
    command.Parameters.Add("@Price", MySqlDbType.Decimal).Value = price.ToString();
    command.ExecuteNonQuery();
    _connection.Close();

【讨论】:

除非你有十进制列,这意味着你的意图是存储小数值(ETH)并且你在那里写整数(Wei)。 你可以转换成小数 Value = (decimal)price @Evk 好点。我将其更改为 DECIMAL(36,0)

以上是关于如何将 C# BigInteger 转换为 MySQL DECIMAL(36,18)?的主要内容,如果未能解决你的问题,请参考以下文章

byte[] 到无符号 BigInteger?

如何在 Java 中将语言环境格式的数字转换为 BigInteger?

java中BigDecimal和bigInteger如何转换

如何从 Java 中的 BigInteger 获取无符号字节数组?

JOOQ 强制类型将 BigInteger 转换为 BigDecimal 以用于 POSTGRES

graphene-django 将 models.BigInteger() 转换为 graphene.Integer()