要执行的第一个参数必须是字符串或Unicode查询


问题内容

我正在尝试使用pyodbc将blob数据上传到ms-sql db。我得到 “要执行的第一个参数必须是字符串或Unicode查询” 错误。

该代码是

file = pyodbc.Binary(open("some_pdf_file.pdf", "r").read())

cur.execute("INSERT INTO BlobDataForPDF(ObjectID, FileData, Extension) VALUES ('1', " + file + ", '.PDF')")
cur.commit()

第一个参数ObjectID作为字符串发送。我没发现任何问题,但我有什么遗漏吗?


问题答案:

使用参数化插入:

file = pyodbc.Binary(open("some_pdf_file.pdf", "r").read())
sql = "insert into BlobDataForPDF(ObjectID, FileData, Extension) values (?, ?, ?)"
cur.execute(sql, ('1', file, '.PDF'))
cur.commit()

当前代码正在尝试将二进制数据与您的插入字符串连接在一起。使用参数可以将SQL字符串与插入的值隔离开,从而防止SQL注入,并且如果您多次使用不同的值执行插入操作,则效率更高。示例用法在这里