PyODBC, cursor.execute () не будет вставлять параметры в строку SQL

Я использую pypyodbc для вставки данных в базу данных, и когда я использую команду cursor.execute (), я пытаюсь поместить строку sql и параметры, но я получаю следующую ошибку:

     SELECT uid FROM HP_DATA WHERE( hpName = ? AND processID = ? AND ipAddress = ? AND port = ? AND usernameTried = ? AND passwordTried = ? AND fileID = ?);
    INSERT INTO HP_DATA_LOGIN_DETAIL(uid, attackDate, gmtOffset) VALUES(?, CONVERT(DATETIME, ?, 126), ?);
    2016-04-19T05:40:58.000
    ('22007', '[22007] [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting date and/or time from character string.')

Это мой код:

    # Inserting the info of the file that is read into HP_DATA_LOG
                    #   This is supposed to allow us to check in the future, what files are read/unread
                    print("Inserting File data into HP_DATA_LOG...")
                    log_file_date_read = datetime.datetime.today()
                    log_file_date_added = datetime.datetime.fromtimestamp(os.path.getctime(path)).strftime("%Y-%m-%d %H:%M:%S.%f")
                    file_size = os.path.getsize(path)
                    #log_sql = "INSERT INTO HP_DATA_LOG(dateRead, dateAdded, fileName, fileSize) VALUES("
                    #log_sql += "'" + str(log_file_date_read) + "', "
                    #log_sql += "'" + str(log_file_date_added) + "', "
                    #log_sql += "'" + path + "', "
                    #log_sql += "" + str(file_size) + ");"
                    log_params = (log_file_date_read, log_file_date_added, file_name, file_size)
                    log_sql = '''INSERT INTO HP_DATA_LOG(dateRead, dateAdded, fileName, fileSize) VALUES(?, ?, ?, ?);'''
                    print(log_sql)
                    cursor.execute(log_sql, log_params)


                    # Getting the auto-generated fileID from the table
                    print("Getting fileID...")
                    #get_fileID_sql = "SELECT fileID FROM HP_DATA_LOG WHERE "
                    #get_fileID_sql += "(dateRead = '" + str(log_file_date_read) + "'"
                    #get_fileID_sql += " AND dateAdded = '" + str(log_file_date_added) + "'"
                    #get_fileID_sql += " AND fileName = '" + path + "'"
                    #get_fileID_sql += " AND fileSize = '" + str(file_size) + "');"
                    fileID_params = (log_file_date_read, log_file_date_added, file_name, file_size)
                    get_fileID_sql = '''SELECT fileID FROM HP_DATA_LOG WHERE (dateRead = ? AND dateAdded = ? AND fileName = ? AND fileSize = ?);'''
                    print(get_fileID_sql)
                    cursor.execute(get_fileID_sql, fileID_params)
                    fileID = cursor.fetchone()

                    # Logging the attack by Inserting the HoneyPot data into HP_DATA
                    hp_name = re.findall('-\d\d:\d\d\s(.*)\ssshd', line)
                    pid = re.findall('\ssshd-22\[(\d+)\]', line)
                    ip_add = re.findall('\sIP:\s(\d+.\d+.\d+.\d+)\s', line)
                    port = re.findall('\s.\d+\sPass(.*)Log\s', line)
                    if port == "2222":
                        port = '2222'
                    else:
                        port = '22'
                    username = re.findall('\sUsername:\s(.*)\sPas', line)
                    password = re.findall('\sPassword:\s(.*)', line)
                    #sql = "INSERT INTO HP_DATA(hpName, processID, ipAddress, port, usernameTried, passwordTried, fileID) VALUES("
                    #sql += "'" + hp_name[0] + "', "
                    #sql += str(int(pid[0])) + ", "
                    #sql += "'" + ip_add[0] + "', "
                    #sql += str(port) + ", "
                    #sql += "'" + username[0] + "', "
                    #sql += "'" + password[0] + "', "
                    #sql += str(list(fileID)[0]) + ");"
                    sql_params = (hp_name[0], pid[0], ip_add[0], port, username[0], password[0], fileID[0])
                    sql = '''INSERT INTO HP_DATA(hpName, processID, ipAddress, port, usernameTried, passwordTried, fileID) VALUES(?, ?, ?, ?, ?, ?, ?);'''
                    print(sql)
                    cursor.execute(sql, sql_params)

                    #
                    #user_sql = r"SELECT uid FROM HP_DATA WHERE("
                    #user_sql += "hpName = '" + hp_name[0] + "' AND "
                    #user_sql += "processID = " + str(int(pid[0])) + " AND "
                    #user_sql += "ipAddress = '" + ip_add[0] + "' AND "
                    #user_sql += "port = " + str(port) + " AND "
                    #user_sql += r"usernameTried = '" + username[0] + "' AND "
                    #user_sql += r"passwordTried = '" + password[0] + "' AND "
                    #user_sql += "fileID = " + str(list(fileID)[0]) + ");"
                    user_sql_params = (hp_name[0], pid[0], ip_add[0], port, username[0], password[0], fileID[0])
                    user_sql = '''SELECT uid FROM HP_DATA WHERE( hpName = ? AND processID = ? AND ipAddress = ? AND port = ? AND usernameTried = ? AND passwordTried = ? AND fileID = ?);'''
                    print(user_sql)
                    cursor.execute(user_sql, user_sql_params)
                    uid = cursor.fetchone()

                    # Inserting date and time information in order to prevent duplicates
                    attack_date = re.findall('(\d{4}-\d\d-\d\d)T', line)
                    timestamp = re.findall('T(\d\d:\d\d:\d\d.*).*-.*sshd', line)
                    attack_datetime = attack_date[0] + "T" + timestamp[0] + ".000"
                    gmt_offset = re.findall('\d\d:\d\d:\d\d.*-(\d\d:\d\d)\s', line)
                    #hp_detail_sql = r"INSERT INTO HP_DATA_LOGIN_DETAIL(uid, attackDate, attackTime, gmtOffset) VALUES("
                    #hp_detail_sql += "" + str(uid[0]) + ", "
                    #hp_detail_sql += "'" + attackDate[0] + "', "
                    #hp_detail_sql += "'" + timestamp[0] + "', "
                    #hp_detail_sql += "'" + gmt_offset[0] + "');"
                    hp_detail_sql_params = (uid[0], attack_datetime[0], gmt_offset[0])
                    hp_detail_sql = '''INSERT INTO HP_DATA_LOGIN_DETAIL(uid, attackDate, gmtOffset) VALUES(?, ?, ?);'''
                    print(hp_detail_sql)
                    print(attack_datetime)
                    cursor.execute(hp_detail_sql, hp_detail_sql_params)
        print("Executed insert statements")
 M. Barbieri16 июн. 2016 г., 19:21
Дата атаки - DATETIME @Bryan
 Bryan16 июн. 2016 г., 19:17
Какой тип данныхattackDate столбец в SQL Server?
 Dilettant16 июн. 2016 г., 16:20
Да :-) ожидает что-то pypyodbc как setup / initialized.
 M. Barbieri16 июн. 2016 г., 16:34
Это, кажется, работает, однако причина, по которой я переключился с? /% S на простую конкатенацию к строке SQL, заключалась в том, что поля DATE и TIME не преобразовывались из строки символов, поэтому теперь я получаю эту ошибку: «SQL содержит 2 маркера параметров, но было предоставлено 4 параметра "
 Dilettant16 июн. 2016 г., 19:02
Только последнее утверждение провалилось? Я думаю, нет, но последнее утверждение не должно быть (вывод синтаксиса вызова преобразования из вашего примера):INSERT INTO HP_DATA_LOGIN_DETAIL(uid, attackDate, gmtOffset) VALUES(?, CONVERT(DATETIME, '?', 126), ?); (Я не знаю в этот момент, для чего 126 в этой функции преобразования, но до тех пор, пока это не 42 ...?
 Dilettant16 июн. 2016 г., 16:01
Формат заполнителя иногда '?' иногда ... мне кажется, что pypyodbc следует запросить (или прочитать исходный код), какой стиль параметров он ожидает, затем использовать это, ...
 M. Barbieri16 июн. 2016 г., 18:57
Да, я пробовал все это, не повезло ....
 Dilettant16 июн. 2016 г., 18:01
Не уверен, но возможно попробуюINSERT INTO HP_DATA_LOG('dateRead', ... если преобразование из строки в дату завершается неудачно или оно находится в полезной нагрузке (как я предложил в предыдущем комментарии), чтобы попробовать литералы, исходящие из вызовов метода python dateteim ...
 M. Barbieri16 июн. 2016 г., 17:52
Я обновил вопрос, я заменил конкатенацию на "?" и это ошибка, которую я получаю
 M. Barbieri16 июн. 2016 г., 18:17
Хорошо, я согласен, однако, данные являются динамическими, поэтому я не могу просто добавить «\» к каждому входу, потому что он динамически берется из текстового файла
 Dilettant16 июн. 2016 г., 18:55
Многоязычные стеки иногда поражают воображение, извините, я имел в виду не то, что набрал:VALUES(?, ...) может понадобиться либо перейти вVALUES('?', ...) или если этого недостаточно, то вам может понадобитьсяVALUES(CAST('?' AS DATE), ...) или что-то вроде этого. Снова извините за то, что вы не синхронизированы с мозгом ;-)
 Dilettant16 июн. 2016 г., 16:40
Делать форматы и содержаниеdatetime.datetime.today()и другие. результаты вызовов соответствуют ожиданиям pypyodbc соотв. база данных? Можете ли вы напечатать некоторые результаты и дословно заполнить их в SQL-запросе в реальном времени к БД, чтобы увидеть, работает ли он - может быть, другие, обнаружившие что-то очевидное, прыгнут ...
 M. Barbieri16 июн. 2016 г., 16:12
Как вместо "% s" просто поставить "?" @Dilettant

Ответы на вопрос(1)

Решение Вопроса

использованиеdatetime.strptime () преобразоватьattack_datetime значение дляДата и время объектдо передача значения в SQL Server.

Например, передача даты и времени в форматестрока завершается с тем же сообщением об ошибке, которое вы получаете

...
# assumes connection and cursor objects initialized
create_date_str = "2016-06-16T01:23:45.67890"
sql = "select name, create_date from sys.databases where create_date = ?"
rows = cursor.execute(sql, create_date_str).fetchall()

Повышения

Traceback (последний вызов был последним): файл "", строка 1, в pyodbc.DataError: ('22007', '[22007] [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Преобразование не выполнено при преобразовании даты и / или время из символьной строки. (241) (SQLExecDirectW) ')

При преобразовании строки datetime в datetimeобъект преуспевает

...
# convert datetime string to object, specifying input format
create_date = datetime.datetime.strptime(create_date_str, '%Y-%m-%dT%H:%M:%S.%f')
rows = cursor.execute(sql, create_date).fetchall()
 M. Barbieri17 июн. 2016 г., 04:52
Это сработало, я немного изменил ". *" В конце регулярного выражения для attackDate, и форматирование прошло. Спасибо за помощь!
 M. Barbieri16 июн. 2016 г., 20:28
Спасибо за ответ, я пытался это сделать, однако я получаю сообщение об ошибке «объект datetime.datetime не подписан», есть идеи?
 Bryan16 июн. 2016 г., 20:32
Скорее всего еще используюattack_datetime[0] для сбора параметров, а неattack_datetime, Смотрите это объяснениеsubscriptable.
 M. Barbieri16 июн. 2016 г., 20:44
Я имею в виду attack_datetime = attack_date [0] + "T" + timestamp [0], однако я не пишу явно "strptime (attack_datetime [0])"

Ваш ответ на вопрос