Python无法将字符串转字节存入SQL Server varbinary(max)列如何解决?
错误原因
- 你当前传入
photop字段(varbinary(max)类型)的参数是self.pixL.text(),这个值是字符串类型,SQL Server无法直接将字符串隐式转换为二进制类型,所以触发报错。 - 更核心的问题是你没有读取图片本身的二进制内容,只是把文件路径转成了bytes,再存到QLabel的text里后又变回了字符串,完全没有拿到图片本身的二进制数据。
代码修改步骤
1. 调整选择图片的逻辑,读取图片二进制内容
选择文件后直接读取图片文件的二进制流,存到类的实例属性里,不要存到QLabel的text属性中:
try: fname, _ = QFileDialog.getOpenFileName(self, 'Open', 'c:\\', "image Files (*.jpg *.png)") # 读取图片二进制内容,存到实例变量里 with open(fname, 'rb') as f: self.image_binary = f.read() self.pixL.setPixmap(QPixmap(fname).scaled(250, 250)) self.pixTx.setText(fname) except Exception as err: print(err)
2. 调整插入SQL的参数
插入时直接传刚才存的二进制实例变量即可,pyodbc会自动适配varbinary(max)类型:
self.cursor.execute( "INSERT INTO pixx1(photop, photopath)" "VALUES(?,?)", (self.image_binary, self.pixTx.text()) ) # 记得执行commit,不然数据不会落库 self.conn.commit()
注意事项
- 不要用base64转码后存储,转码后数据量会变大,直接存原生二进制就可以适配SQL Server的varbinary(max)类型。
- 要确保类初始化的时候提前声明
self.image_binary属性,避免选择文件前执行插入时报属性不存在的错误。 - 插入操作后必须调用连接对象的commit方法,否则数据不会实际写入数据库。
内容的提问来源于stack exchange,提问作者CCCC
相关产品推荐
相关产品推荐

