2015-02-26 6 views
1

Я пытаюсь сохранить текущее время в моей базе данных доступа со следующим сценарием:Установки времени в MS Access с питоном ODBC

import pyodbc 
import time 

connStr = """ 
DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; 
DBQ=C:/Users/QPCS Registration/Documents/DB Tests/PYODBC.accdb; 
""" 
cnxn = pyodbc.connect(connStr) 
cursor = cnxn.cursor() 

def TimeStamp(): 
    RFID = str(input("Please tap your pass on the reader:\n")) 
    Current_Time = str(time.strftime("%H:%M")) 
    cursor.execute('INSERT INTO Time_Of_Entry(RFID_Number,Time_Tapped) VALUES('+RFID+','+Current_Time+');') 
    cnxn.commit() 

def Close_DB_Cnxn(): 
    cnxn.close() 

TimeStamp() 
Close_DB_Cnxn() 

Когда я запускаю его я получаю следующее сообщение об ошибке:

pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression '19:44'. (-3100) (SQLExecDirectW)") 

Проблема, безусловно, связана с «Current_Time», потому что, когда я пытаюсь сохранить переменную «RFID» со сценарием, показанным ниже, она вставляется в базу данных просто отлично.

cursor.execute('INSERT INTO Time_Of_Entry(RFID_Number) VALUES('+RFID+');') 

Я попытался изменить тип данных поля «Time_Tapped» в таблице «Time_Of_Entry» из короткого текста, до даты/времени; Короткое время, но это не имело никакого эффекта.

Моя машина работает на Windows 7 home premium 64-bit. У меня есть Microsoft Office 2010; 32-разрядный Я запускаю python 3.3; 32-бит

+0

возможно дубликат [Работа с датами в Access с помощью pyodbc давая «Слишком много параметров» ошибка] (http://stackoverflow.com/questions/28568110/working -with-dates-in-access-using-pyodbc-giving-too-few-parameters-error) –

+0

@GordThompson Я видел это, но не проблема моя? У меня возникли проблемы с вводом «Current_Time» в поле Date/Time в доступе, тогда как они читают его. – Michael

ответ

1

Параметрированные запросы полезны как для запросов INSERT, так и для запросов SELECT, когда задействованы значения Date/Time. Вместо того, чтобы возиться с форматами даты и времени и разделителями, вы просто передаете значение Date/Time в качестве параметра и позволяете этому уровню доступа к данным (ODBC в этом случае) сортировать его.

Следующий пример работает для меня:

from datetime import datetime, time 
import pypyodbc 

rfid = "GORD123" ## for testing 

now = datetime.now() 
currentTime = datetime(1899, 12, 30, now.hour, now.minute) 

connStr = """ 
Driver={Microsoft Access Driver (*.mdb, *.accdb)}; 
Dbq=C:/Users/Public/Database1.accdb; 
""" 
cnxn = pypyodbc.connect(connStr) 
cursor = cnxn.cursor() 
sql = """ 
INSERT INTO Time_Of_Entry (RFID_Number, Time_Tapped) VALUES (?, ?) 
""" 
parameters = (rfid, currentTime) 
cursor.execute(sql, parameters) 
cursor.close() 
cnxn.commit() 
cnxn.close() 

Примечания:

  1. Я использовал pypyodbc вместо pyodbc, потому что я использую Python 3.4.3 и последнюю версию установщика pyodbc для Windows, заглушена, когда он не смог найти Python 3.3. Чтобы получить pypyodbc, все, что мне нужно было сделать, было запущено pip install pypyodbc.

  2. Все значения даты/времени в Access имеют как дату, так и время. Для того, чтобы значение даты/времени равнялось , по умолчанию, как время в Access, нам нужно назначить ему «волшебную» дату 1899-12-30. (Это дата, соответствующая CDate(0) в Access.)

Смежные вопросы