You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:21:01