从Access数据库中查询问题:"无法将字符串转换为float:E + 6"

时间:2015-11-17 23:35:52

标签: python ms-access pypyodbc

我在MS Access中有一个数据库。我试图使用pypyodbc查询一个表到Python。我收到以下错误消息:

  

ValueError:无法将字符串转换为float:E + 6

表中的数字相当大,最多有十位有效数字。错误消息告诉我MSAccess正在用科学计数法格式化它们,Python正在将它们作为字符串读取。

表格中的字段格式为带有两位小数的单个字符。当我在数据库中看到表中的数字时,它们没有使用科学记数法进行格式化。但错误消息似乎表明它们是。

此外,如果我将表中的数字(至少测试行)更改为小数字(整数从1到5),则运行查询。这支持了我的理论,即问题是大数字的科学格式化。

有关如何:

的任何想法
  1. 以数字未以科学记数法格式化的方式写入数据库表,或
  2. 让pypyodbc检索数字并忽略任何科学记数法。

2 个答案:

答案 0 :(得分:4)

SingleDouble字段(列)中检索“大”或“小”数字时,这似乎是与Access ODBC驱动程序之间的兼容性问题,其中“大”意味着

  • Single小数点左侧超过6位有效数字的值,或
  • Double小数点左侧超过14位有效数字

和“small”表示

  • Single值小于等号右边的值超过6个,或
  • Double值小数点右侧超过14个零

当数字表示为“正常”小数时(即,不是科学记数法)。

要重新创建的代码:

import pypyodbc
cnxn = pypyodbc.connect(
    r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    r"DBQ=C:\Users\Public\Database1.accdb")
crsr = cnxn.cursor()
try:
    crsr.execute("DROP TABLE tblJunk")
except pypyodbc.ProgrammingError as pe:
    # ignore "table does not exist"
    if pe.value[0] != '42S02':
        raise
crsr.execute("CREATE TABLE tblJunk (ID INT PRIMARY KEY, DoubleField DOUBLE, SingleField SINGLE)")
crsr.execute("INSERT INTO tblJunk (ID, DoubleField) VALUES (1, 12345678.9)")
crsr.execute("SELECT DoubleField, SingleField FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
print(row)
# prints: (12345678.9, None)
crsr.execute("UPDATE tblJunk SET SingleField = DoubleField WHERE ID=1")
crsr.execute("SELECT DoubleField, SingleField FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
# ValueError: could not convert string to float: E+7

解决方法1:对于Single值,使用CDbl()函数可以避免错误:

crsr.execute("SELECT DoubleField, CDbl(SingleField) AS foo FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
print(row)
# prints: (12345678.9, 12345679.0)

解决方法2:使用CStr()函数将值作为字符串返回,然后将其转换为float(适用于Single和{{1} }):

Double

解决方法3:使用代替pypyodbc。

答案 1 :(得分:0)

当我将测试文件放在一起试图重现时,我注意到表中的两个字段设置为Single类型而不是Double。将它们更改为Double,这解决了问题。 很抱歉打扰并感谢您的帮助。