我使用pypyodbc从访问数据库中选择数据。我使用以下查询和三个已指定的参数。
我尝试了几个品种,但无济于事。我的语法没有任何问题。
SELECT [Date], [Time], [uSec], [threeR], [twoCV]
FROM [table_a]
WHERE (Date = ? AND Time > ?)
OR (Date > ?)
参数属于以下类型:
[datetime.date, datetime.time, datetime. date]
打印时:
1900-09-16 , 00:00:00, 1900-09-16
pypyodbc.DatabaseError:(' 07002',' [07002] [Microsoft] [ODBC Microsoft Access Driver]参数太少。预计4。' )
#-- Begin Python code sample
#-- Checks the DB file and retrieves data
def pullData(self):
#-- Connect to Access
con = pypyodbc.connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=F:/database.mdb')
cur = con.cursor()
#-- Get column list
columnListODBC = '[thisDate], [thisTime]'
for y in myTable.getColumns():
columnListODBC = columnListODBC + ', [' + y + "]"
#-- See footnote 1
print(columnListODBC)
#-- Get the most recent SQL entry
for row in curSQL.execute('SELECT MAX(Datetime) FROM [' + _.getName() + ']'):
xDateTime = datetime.datetime.strptime(row[0], "%Y-%d-%m %H:%M:%S")
day = xDateTime.date() # Get only the DATE of the most recent entry
time = xDateTime.time() # Get only the TIME of the most recent entry
#-- Pull all ODBC data
queryString = 'SELECT ' + columnListODBC + ' FROM [' + _.getName() + '] WHERE (thisDate = ? AND thisTime > ?) OR (thisDate > ?)'
#-- See footnote 2
print(queryString, ", ", day, ", ", time)
cur.execute(queryString, [day,time,day])
打印1 :[thisDate],[thisTime],[uSec],[threeR],[twoCV]
打印2 :SELECT [thisDate],[thisTime],[uSec],[threeR],[twoCV] FROM [table_a] WHERE(thisDate =?AND thisTime>?)OR( thisDate>?),1900-09-16,00:00
编辑:当我删除其中一列时,似乎成功执行了它。尽管源表中存在两列。这并没有回答原始查询未执行的原因。
SELECT [Date], [Time], [uSec], [twoCV]
FROM [table_a]
WHERE (Date = ? AND Time > ?)
OR (Date > ?)
编辑2 :更改日期和时间列的名称没有什么区别。以下仍然给出错误:
SELECT [thisDate], [thisTime], [uSec], [threeR], [twoCV]
FROM [table_a]
WHERE ([thisDate] = ? AND [thisTime] > ?)
OR ([thisDate] > ?)
[Microsoft] [ODBC Microsoft Access Driver]参数太少。预计5。
答案 0 :(得分:1)
Date
和Time
为reserved words in Access,请确保在查询中使用的任何位置转义保留字:
SELECT [Date], [Time], [uSec], [twoCV]
FROM [table_a] WHERE ([Date] = ? AND [Time] > ?)
OR ([Date] > ?)
答案 1 :(得分:1)
过于补充Bryan Eargle的回答:我刚才遇到过这个问题。 结果发现列名错误。
当我故意使用两个错误的列名时,我收到以下错误:
Expected 2.
请注意,在最后一行中,t = 0.5*(x + 1)*(b - a) + a
与有问题的列数对齐。对我来说,当列名正确时,问题就会消失。
答案 2 :(得分:1)
错误来自第一个游标查询,因为当您使用表格设计视图显示时(除非屏幕截图中有更多字段),[Datetime]
中没有名为table_a
的列:< / p>
for row in curSQL.execute('SELECT MAX(Datetime) FROM [' + _.getName() + ']'):
考虑更改字段以反映新列名称。此外,要使用strptime()
,原始变量row[0]
必须是字符串,因此您可能会收到Python TypeError
。 Jet / ACE datetime字段将作为datetime字段导入到Python中,因此无需转换:
for row in curSQL.execute('SELECT MAX(thisDate) FROM [' + _.getName() + ']'):
xDateTime = row[0]
day = xDateTime.date()
time = xDateTime.time()