【问题标题】:Using ADO through ODBC MariaDB Connector, I can't seem to return the decimal properly通过 ODBC MariaDB 连接器使用 ADO,我似乎无法正确返回小数点
【发布时间】:2018-02-23 23:32:43
【问题描述】:

我最近从 MySQL 迁移到 MariaDB,我的价格下降了小数点后两位。我进行了检查,价格列的类型设置为小数(19,4),这样如果需要,我可以有四个小数点的准确性。

  • 使用 select 语句登录 MariaDB,价格还可以。
  • 用heidisql登录也显示价格还可以。
  • 查看使用我尝试使用的相同 ODBC 连接的链接表也是正确的。

所以我得出结论,通过 ADO 和 ODBC 连接器进行连接是有问题的。

我看了看,发现如果我将我的 sql 语句转换为小数(6,2),那么小数会正确显示,所以我直接在 mariadb 中重新转换了表格。

但是我注意到所有价格都显示正确,除了小数位有两个零的价格。

值为 5.00,我返回的是 0.05

我不确定我哪里出错了,但这意味着任何整数或零都不会保留它们的位置。我该如何解决这个问题?是我的专栏的投射方式,还是 vba:ado 解释它收到的内容的方式,还是 odbc 连接器返回的方式?

这是我用来调试这个问题的代码:

Public Sub decimalcheck()
  Dim db As New ADODB.Connection
  Dim rs As New ADODB.Recordset
  Dim constring As String

  constring = "DSN=my_dsn;"
  db.Open constring, "user", "pass"
  rs.ActiveConnection = db
  rs.Source = "select Prices FROM my_table "
  rs.Source = "select cast(my_prices as decimal(6,2) ) FROM my_table"

  rs.Open
  rs.MoveFirst
  Do While Not rs.EOF And Not rs.BOF
    Debug.Print rs.Fields(0)
    Debug.Print CDec(rs.Fields(0))
    rs.MoveNext
  Loop

  rs.Close
end sub

更新

我将一些结果转换为双精度,所以我不需要研究是否值得将其保留为小数或双精度。

【问题讨论】:

    标签: odbc decimal ado mariadb


    【解决方案1】:

    好的,这是我的结果:

    所以我的假设是 ado(或 vba)更习惯于使用 double 并且不能真正正确地解释十进制。所以这给我们留下了一个问题

    十进制和双精度有什么区别

    1. 我没有找到太多。数字的大小有所不同,但是如果您要提供诸如十进制(19,4)或双精度(19,4)之类的限制,那么除非您超出两者之一范围,那么您就会陷入使用另一个问题或寻找不同解决方案的困境。所以对我来说这没什么大不了的。
    2. 似乎人们说十进制比双精度更精确。不知道这意味着什么,我猜是科学精度。我正在使用金钱,所以也许我会在我的情况下满足于十进制,即使它可能不是必需的,而且可能是矫枉过正。 (请参阅 Vladislav Vaintroub 评论,如果十进制在 M、D 范围内,则绝对精确。因此将其与代表金钱的数字一起使用。

    我看到了两种解决方案,但可能有很多

    1. 首先,您可以将小数点改为双倍并保持不变。
    2. 其次,将列保留为小数,然后在选择语句中将其与 ADO 一起使用时将其转换为双精度。示例代码:

      从 my_table 中选择 CAST(column_name AS DOUBLE(19,4))

    很抱歉问了一个问题,只是过了一会儿才弄明白。希望它可以帮助其他人,如果不是......那么删除它。

    【讨论】:

    • 小数不仅更精确。如果结果符合小数 (M,N) 范围,则小数是精确的。 Double 是奇怪的、科学的、算术运算可能会导致与预期的小偏差。为了钱,最好取小数。
    • 谢谢,那么这场辩论就结束了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多