如何解决“无效的日期时间格式”使用 .read_sql() 读取 MS Access 日期/时间值
尝试读取旧访问 .mdb 时,ODBC 到 python 类型绑定导致问题
有一个类似的问题 here,但我无法让它在 python 中工作。
我用它来读取我的 .mdb
import pandas as pd
import os
import pyodbc
##Source Conn
def get_source_conn():
driver = '{Microsoft Access Driver (*.mdb)}'
path = r'//SERVER/database.mdb'
assert os.path.exists(path)
return pyodbc.connect(driver=driver,dbq=path,CHARSET='UTF8')
def safeRead(sql):
try:
conn = get_source_conn()
conn.setdecoding(pyodbc.sql_CHAR,encoding='utf-8')
conn.setdecoding(pyodbc.sql_WCHAR,encoding='utf-8')
# conn.setdecoding(pyodbc.sql_TYPE_DATE,encoding='utf-8')
df = pd.read_sql(sql,conn)
finally:
try:
conn.close()
except:
pass
return df
class InventoryTransaction():
@classmethod
def all(cls):
return safeRead('SELECT * FROM [INVENTORY TRANSACTIONS]')
dfTransactionTarget = InventoryTransaction.all()
以上产生此错误:
DataError: ('22007','[22007] [Microsoft][ODBC Microsoft Access Driver]Invalid datetime format on column number 2 (TransactionDate) (35) (sqlGetData)')
如果我取消注释类型绑定以尝试将 sql_TYPE_DATE 转换为字符串,我会得到:
ValueError: Invalid sqltype 91. Must be sql_CHAR or sql_WCHAR or sql_WMetaDATA
如果我可以完全以字符串形式获取 ODBC 的结果,我也可以强制自己执行所有类型,因为所讨论的数据不是那么大的集合。
我如何成功读取这些数据?
**其他信息基于@GordThompson 的建议 **
- CStr 似乎不能处理 NULLS
((
"SELECT "
"[TransactionID],"
"CStr([TransactionDate]) AS someCol,"
"[ProductID] "
"FROM [INVENTORY TRANSACTIONS] "
# "WHERE ISNULL([TransactionDate]) = 0 "
))
输出:
DataError: ('22018','[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid use of Null (-3030) (sqlGetData)')
- 即使我过滤掉空值,我也没有得到可以使用的东西:
((
"SELECT "
"[TransactionID],"
"[ProductID] "
"FROM [INVENTORY TRANSACTIONS] "
"WHERE [TransactionDate] IS NULL "
))
输出:
DataError: ('22018','[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid use of Null (-3030) (sqlGetData)')
#(same error)
- 如果我尝试更复杂的事情:
((
"SELECT "
"[TransactionID],"
"IIF(ISNULL([TransactionDate]),'',CStr([TransactionDate])) AS someCol,'[22018] [Microsoft][ODBC Microsoft Access Driver] Invalid procedure call (-3030) (sqlGetData)')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。