4

アクセスデータベースからデータを選択するためにpypyodbcを使用しています。指定された 3 つのパラメーターを使用して、次のクエリを使用しています。

何種類か試しましたがダメでした。構文に問題はありません。


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]

Print 2 : SELECT [thisDate], [thisTime], [uSec], [threeR], [twoCV] FROM [table_a] WHERE (thisDate = ? AND thisTime > ?) OR (thisDate > ?) , 1900-09-16 , 00:00:00


編集:いじりながら、列の1つを削除すると正常に実行されるようです。ソーステーブルには両方の列が存在しますが。これは、元のクエリが実行されない理由に関する質問には答えません。

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。

編集 3 : これは、プル元のテーブルのデザイン ビューです。 ここに画像の説明を入力

4

3 に答える 3

2

Bryan Eargle の回答を補足しすぎると、今これに遭遇しました。列名が間違っていることが判明しました。

2 つの間違った列名を意図的に使用すると、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\...\some_code.py", line 74, in <module>
    table_headers, table_data = fetch_relations()
  File "C:\...\some_code.py", line 27, in fetch_relations
    cur.execute(sql);
  File "C:\Python34\lib\site-packages\pypyodbc.py", line 1605, in execute
    self.execdirect(query_string)
  File "C:\Python34\lib\site-packages\pypyodbc.py", line 1631, in execdirect
    check_success(self, ret)
  File "C:\Python34\lib\site-packages\pypyodbc.py", line 986, in check_success
    ctrl_err(SQL_HANDLE_STMT, ODBC_obj.stmt_h, ret, ODBC_obj.ansi)
  File "C:\Python34\lib\site-packages\pypyodbc.py", line 966, in ctrl_err
    raise DatabaseError(state,err_text)
pypyodbc.DatabaseError: ('07002', '[07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.')

最後の行で、Expected 2.問題のある列の数と一致していることに注意してください。私にとっては、列名が正しいと問題はなくなります。

于 2015-11-01T12:38:14.430 に答える
1

エラーは、最初のカーソル クエリから派生します。これは、テーブル デザイン ビューで示すように (スクリーンショットで切り取られたフィールドがさらにない限り)、次のような列が呼び出さ[Datetime]れないためtable_aです。

for row in curSQL.execute('SELECT MAX(Datetime) FROM [' + _.getName() + ']'):

新しい列名を反映するようにフィールドを変更することを検討してください。さらに、strptime()元の変数を使用するrow[0]には文字列でなければならないため、 Python TypeError. Jet/ACE 日時フィールドは既に日時フィールドとして Python にインポートされるため、変換の必要はありません。

for row in curSQL.execute('SELECT MAX(thisDate) FROM [' + _.getName() + ']'):
    xDateTime = row[0]
    day = xDateTime.date() 
    time = xDateTime.time() 
于 2015-11-01T15:59:10.593 に答える