通过 ODBC MariaDB 连接器使用 ADO,我似乎无法正确 return 小数
Using ADO through ODBC MariaDB Connector, I can't seem to return the decimal properly
我最近从 MySQL 迁移到 MariaDB,我的价格低了两位小数。我已经进行了检查,并将价格列的类型设置为 decimal(19,4),这样我就可以在需要时精确到小数点后四位。
- 使用 select 语句登录到 MariaDB 价格还可以。
- 用heidi登录sql也显示价格还可以
- 查看使用我尝试使用的相同 ODBC 连接的链接 table 也是正确的。
所以我得出结论,通过 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。所以这给我们留下了一个问题:
十进制和双精度有什么区别
- 我没找到多少。数字可以有多大是不同的,但是如果你要提供一个限制,比如 decimal(19,4) 或 double(19,4) 那么这并不重要,除非你超出了两者之一范围,然后你有点卡在使用另一个,或者寻找不同的解决方案。所以对我来说这没什么大不了的。
- 好像有人在说十进制比双精度更精确。不确定这意味着什么,我猜是科学的精确性。我正在与钱打交道,所以也许我会在我的情况下接受小数,即使它可能不是必需的,而且可能有点矫枉过正。 (参见 Vladislav Vaintroub 评论,如果小数在 M,D 范围内,则它是绝对精确的。因此将它与代表金钱的数字一起使用。)
我看到了两个解决方案,但可能有很多
- 首先,您可以将小数点改为双精度并保持不变。
其次,您将该列保留为小数,然后在 select 语句中将其与 ADO 一起使用时将其转换为双精度。示例代码:
SELECT CAST( column_name AS DOUBLE(19,4) ) 来自 my_table
很抱歉问了一个问题,只是过一会儿才弄明白。希望它对其他人有帮助,如果没有...我们删除它。
我最近从 MySQL 迁移到 MariaDB,我的价格低了两位小数。我已经进行了检查,并将价格列的类型设置为 decimal(19,4),这样我就可以在需要时精确到小数点后四位。
- 使用 select 语句登录到 MariaDB 价格还可以。
- 用heidi登录sql也显示价格还可以
- 查看使用我尝试使用的相同 ODBC 连接的链接 table 也是正确的。
所以我得出结论,通过 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。所以这给我们留下了一个问题:
十进制和双精度有什么区别
- 我没找到多少。数字可以有多大是不同的,但是如果你要提供一个限制,比如 decimal(19,4) 或 double(19,4) 那么这并不重要,除非你超出了两者之一范围,然后你有点卡在使用另一个,或者寻找不同的解决方案。所以对我来说这没什么大不了的。
- 好像有人在说十进制比双精度更精确。不确定这意味着什么,我猜是科学的精确性。我正在与钱打交道,所以也许我会在我的情况下接受小数,即使它可能不是必需的,而且可能有点矫枉过正。 (参见 Vladislav Vaintroub 评论,如果小数在 M,D 范围内,则它是绝对精确的。因此将它与代表金钱的数字一起使用。)
我看到了两个解决方案,但可能有很多
- 首先,您可以将小数点改为双精度并保持不变。
其次,您将该列保留为小数,然后在 select 语句中将其与 ADO 一起使用时将其转换为双精度。示例代码:
SELECT CAST( column_name AS DOUBLE(19,4) ) 来自 my_table
很抱歉问了一个问题,只是过一会儿才弄明白。希望它对其他人有帮助,如果没有...我们删除它。