通过ODBC MariaDB Connector使用ADO,我似乎无法正确返回小数

时间:2016-10-24 20:32:54

标签: odbc decimal ado mariadb

我最近从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

更新

我将某些结果投射为双倍,所以我不需要研究它是否值得将其保持为十进制或者加倍。

1 个答案:

答案 0 :(得分:0)

好的,这是我的结果:

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

Decimal和Double

之间有什么区别
  1. 我找不到多少。数字的大小有所不同,但如果要提供十进制(19,4)或双精度(19,4)这样的限制,那么除非你超出两者中的一个,否则无关紧要范围,那么你有点困惑使用另一个,或找到一个不同的解决方案。所以对我来说这不是什么大问题。
  2. 似乎人们都说十进制比精确度更精确。不知道这意味着什么,我猜科学精确。我正在处理金钱,所以也许我会在我的情况下满足于十进制,即使它可能不是必需的,也可能是矫枉过正。 (参见Vladislav Vaintroub评论,如果它符合M,D范围,则十进制是绝对精确的。因此将其用于代表金钱的数字。
  3. 我看到两个解决方案,但可能有很多

    1. 首先,您可以将小数更改为两倍,并将其保留为该值。
    2. 其次,将列保留为小数,然后在select语句中将其与ADO一起使用时将其转换为double。示例代码:

      SELECT CAST(column_name AS DOUBLE(19,4))FROM my_table

    3. 很抱歉只是问了一个问题,过了一会儿。希望它能帮助其他人,如果不是......那就删除吧。