pyodbc: сбой преобразования при преобразовании даты и / или времени из символьной строки

Я новичок в питоне. В настоящее время у меня есть код Python для вставки новых данных в мою базу данных Microsoft SQL, и я делаю это следующим образом:

import pyodbc
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=DESKTOP-H7KQUT1;"
                      "Database=SAOS1;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()


print ('Inserting a new row into table')
#Insert Query
tsql = "INSERT INTO attendance (Atd_Date, Atd_InTime, Atd_OutTime, SID) VALUES (?,?,?,?);"
with cursor.execute(tsql,'2018/11/14','07:11:34','14:32:11','18010321'):
    print ('Successfuly Inserted!')

Однако с другой стороны у меня есть проект Arduino, который записывает посещаемость студентов с помощью отпечатков пальцев. Последовательный монитор будет отображать выходные данные, когда будет найдено совпадение. Мой код Arduino:

void setup()
   {
     ....
   }
void loop()
   {
     ...
     //Found a match
     Serial.println("{'SID':"+ String(finger.fingerID) +",'Time':"+ String(timeString) +"}");
   }

Пример вывода будет таким:

{'SID':1,'Time':07:11:13}

Я хотел бы поймать этот вывод из последовательного порта и позволить моему коду python получить этот вывод и сохранить его в базе данных MSSQL. Я ссылаюсь на этот веб-сайт Итак, я делаю это так:

import pyodbc
import serial
import time
import datetime
import ast
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=DESKTOP-H7KQUT1;"
                      "Database=SAOS1;"
                      "Trusted_Connection=yes;")
cursor = cnxn.cursor()

#initial serial port
arduino = serial.Serial('COM4', 9600, timeout=.1)
#fetch data from serial
data = arduino.readline()[:-2].decode("utf-8")
if data!="":

        SID = ast.literal_eval(data)['SID']
        Atd_InTime = ast.literal_eval(data)['Time']

print ('Inserting a new row into table')
#Insert Query
tsql = "INSERT INTO attendance (Atd_Date, Atd_InTime, Atd_OutTime, SID) VALUES (?,?,?,?);"
with cursor.execute(tsql,'2018/11/14','Time','14:32:11','SID'):
    print ('Successfuly Inserted!')

Но я не смог этого сделать. Я не совсем уверен, что это правильный способ. Кроме того, я получаю такую ​​ошибку:

строка 24 с cursor.execute (tsql, '2018/11/14', 'Time', '14:32:11', 'SID'): сбой преобразования при преобразовании даты и / или времени из символьной строки.


person Xavier    schedule 17.11.2018    source источник
comment
Аналогичный pyodbc-dataerror. Удалите свой повторяющийся код и покажите вместо него свой CREATE TABLE ....   -  person stovfl    schedule 17.11.2018
comment
Соответствующий cant-insert-date-and-time-to -sql-server-via-pyodbc   -  person stovfl    schedule 17.11.2018
comment
@stovfl Я думаю, что он не только не может вставить дату / время в таблицу. Вся идея и код Python имеют проблемы. Я думаю, что у моего второго кода Python, приведенного выше, есть и другая проблема. Кстати, спасибо за информацию   -  person Xavier    schedule 17.11.2018
comment
Попробуйте выделить одну проблему и составить минимально воспроизводимый пример   -  person stovfl    schedule 17.11.2018


Ответы (1)


cursor.execute(tsql,'2018/11/14','Time','14:32:11','SID')

Вторым значением параметра (третьим аргументом метода .execute) является строковый литерал 'Time'. SQL Server жалуется, что не может преобразовать эту строку в допустимое значение времени.

Если вы настроите свой код Arduino, чтобы вернуть

{'SID':1,'Time':'07:11:13'}

тогда вы могли бы просто использовать

cursor.execute(tsql,'2018/11/14',Atd_InTime,'14:32:11',SID)
person Gord Thompson    schedule 17.11.2018