Ошибка «Не удается найти тип данных READONLY» при обновлении до SQL Server - PullRequest
0 голосов
/ 14 марта 2019

Я давно застрял в этой проблеме, надеюсь, кто-нибудь сможет меня просветить. У меня есть база данных SQL я хотел бы обновить. Вот несколько фрагментов кода. Я извлек данные из sql в Python, затем применил функцию hex_to_string & slicing bin и планирую обновить базу данных SQL. У меня нет идентификатора в базе данных, но у меня есть DATETIME, который отличает запись.

query = """ select P from Table """

cnxn = pyodbc.connect(conn_str)
cnxn.add_output_converter(pyodbc.SQL_VARBINARY, hexToString)
cursor: object = cnxn.cursor()

cursor.execute(query)
dtbs= cursor.fetchall()
row_list=[]
ln = len(dtbs)

 cursor.execute(query)

for i in range(ln):
    row=cursor.fetchval()
    result=slicing_bin(row)
    result_float = [float("{0:.2f}".format(i)) for i in result]
    row_list.append(result_float)

crsr = cnxn.cursor()
crsr.execute(query)
aList = [item[0] for item in crsr.fetchall()]
for aValue in aList:
    crsr.execute("""UPDATE Table SET P=? WHERE DATETIME=?""", (row_list, aValue))
crsr.close()
cnxn.commit()

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

Файл "C: /Users/r/.PyCharmCE2018.3/config/scratches/Finalcombined2.py", строка 64, в crsr.execute ("" "ОБНОВЛЕНИЕ Access.dbo.M_PWA SET P_PULSES =? WHERE DATETIME =?" "", (row_list, aValue)) pyodbc.ProgrammingError: ('42000', «[42000] [Microsoft] [ODBC Driver 11 для SQL Server] [SQL Server] столбец, параметр или переменная # 1: невозможно найти тип данных READONLY. (2715) (SQLExecDirectW); [42000] [Microsoft] [Драйвер ODBC 11 для SQL Сервер] [SQL Server] Оператор (ы) не может быть подготовлен. (8180); [42000] [Microsoft] [Драйвер ODBC 11 для SQL Server] [Параметр SQL Server] или переменная '@ P1' имеет недопустимый тип данных. (2724) ")

Пожалуйста, помогите, спасибо.

1 Ответ

1 голос
/ 14 марта 2019

Хм, я бы догадался, что Горд был прав. Это, конечно, первое, на что я посмотрю. Хорошо, вот небольшой пример того, как я делаю обновления в MS Access, из Python.

#import pypyodbc
import pyodbc

# MS ACCESS DB CONNECTION
pyodbc.lowercase = False
conn = pyodbc.connect(
    r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};" +
    r"Dbq=C:\\path_here\\Northwind.mdb;")

# OPEN CURSOR AND EXECUTE SQL
cur = conn.cursor()

# Option 1 - no error and no update
cur.execute("UPDATE dbo_test SET Location = 'New York' Where Status = 'Scheduled'");
conn.commit()


cur.close()
conn.close()

Можете ли вы адаптировать это к вашему конкретному сценарию?

...