通过 ODBC MariaDB 连接器使用 ADO,我似乎无法正确 return 小数

Using ADO through ODBC MariaDB Connector, I can't seem to return the decimal properly

我最近从 MySQL 迁移到 MariaDB,我的价格低了两位小数。我已经进行了检查,并将价格列的类型设置为 decimal(19,4),这样我就可以在需要时精确到小数点后四位。

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

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

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

值为5.00,我返回的是0.05

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

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

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

更新

我将一些结果转换为双精度,因此我无需研究是否值得将其保留为小数或双精度。

好的,这是我的结果:

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

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

  1. 我没找到多少。数字可以有多大是不同的,但是如果你要提供一个限制,比如 decimal(19,4) 或 double(19,4) 那么这并不重要,除非你超出了两者之一范围,然后你有点卡在使用另一个,或者寻找不同的解决方案。所以对我来说这没什么大不了的。
  2. 好像有人在说十进制比双精度更精确。不确定这意味着什么,我猜是科学的精确性。我正在与钱打交道,所以也许我会在我的情况下接受小数,即使它可能不是必需的,而且可能有点矫枉过正。 (参见 Vladislav Vaintroub 评论,如果小数在 M,D 范围内,则它是绝对精确的。因此将它与代表金钱的数字一起使用。

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

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

    SELECT CAST( column_name AS DOUBLE(19,4) ) 来自 my_table

很抱歉问了一个问题,只是过一会儿才弄明白。希望它对其他人有帮助,如果没有...我们删除它。