【问题标题】:"Cannot find data type READONLY" error on UPDATE to SQL ServerUPDATE 到 SQL Server 时出现“找不到数据类型 READONLY”错误
【发布时间】:2019-03-13 23:06:01
【问题描述】:

我被这个问题困扰了很长时间,希望有人能启发我。我有一个我想更新的 sql 数据库。以下是部分代码。我将数据从 sql 提取到 Python,然后应用函数 hex_to_string & slicing bin,我计划更新 SQL 数据库。我在数据库中没有任何 ID,但我有区分条目的 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("""UPDATE Access.dbo.M_PWA SET P_PULSES=?WHERE DATETIME=?""", (row_list, aValue)) pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列, 参数或变量 #1:找不到数据类型 READONLY。 (2715) (SQLExecDirectW); [42000] [Microsoft][适用于 SQL 的 ODBC 驱动程序 11 服务器][SQL Server]无法准备语句。 (8180); [42000] [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]参数或 变量“@P1”的数据类型无效。 (2724)")

请帮忙,谢谢。

【问题讨论】:

  • DATETIME 是 T-SQL 中的保留字,因此如果您将其用作列名,则可能必须将其括在方括号中。
  • 谢谢! @戈德汤普森。另一方面,该程序仍然无法运行。

标签: python sql-server python-3.x sql-update pyodbc


【解决方案1】:

嗯,我猜戈德是对的。这当然是我要看的第一件事。好的,这是我如何从 Python 在 MS Access 中进行更新的一个小示例。

#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()

你能根据你的具体情况调整它吗?

【讨论】:

  • 谢谢!是的,对不起,我没有在问题中包含完整的代码,因为我担心它会太长而且令人困惑。至于[],如果你能帮助我,我会像[DATETIME] =那样写吗?或 DATETIME[]=?,谢谢 :) 谢谢
  • @r-can 基于这篇文章How to deal with SQL column names that look like SQL keywords? 它可能应该是[DATETIME]=?: """UPDATE Table SET P=? WHERE [DATETIME]=?"""
猜你喜欢
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 2015-05-19
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多