【问题标题】:Why is my code unable to convert string to bytes using python and SQL server为什么我的代码无法使用 python 和 SQL 服务器将字符串转换为字节
【发布时间】:2021-09-03 14:56:46
【问题描述】:

几个小时以来,我一直在尝试将我的 python 文件图像保存到我的数据库表中,但由于转换问题并显示以下错误通知而无济于事:

Implicit conversion from data type nvarchar to varbinary(max) is not allowed. Use the CONVERT function to run this query. 

照片的表格列的数据类型为 varbinary(max)。我在这里进行了研究,发现了成员的类似帖子和 cmet,但没有一个可以帮助解决我的问题。

如何在 python 中将字符串值转换为字节以使我能够将记录保存在数据库中?我试图使用字节(文件名),它没有用。我也试过了:

  base64.encodebytes(filename)

我是在导入base64之后这样做的,还是不行。然后我尝试了:

 base(filename,'ascii')

还是不行。

我想要一种情况,当我从对话框上传照片并将其附加到文件中时,上传的照片可以保存在数据库表中为其保留的列中,并且该列的数据类型为 varbinary(max )。以下是我的代码:

        try:
        fname, _ = QFileDialog.getOpenFileName(self, 'Open', 'c:\\', "image Files (*.jpg *.png)")
        strfn = bytes(fname,'ascii')
        self.pixL.setPixmap(QPixmap(fname).scaled(250, 250))
        self.pixTx.setText(fname)
        self.pixL.setText(strfn)
    except Exception as err:
     print(err)

插入语句如下:

             self.cursor.execute(
            "INSERT INTO pixx1(photop, photopath)"
            "VALUES(?,?)",
            #the parameter placholder for pyodbc is the question mark sign (?), whereas that of MySql is %s
            (self.pixL.text(),
             self.pixTx.text())

【问题讨论】:

  • 只是一个建议:为什么不将文件上传到云上的某种存储中,然后将指向它的链接放在您的数据库中?
  • 你好@KevinEaverquepedo,这是一个不使用互联网的桌面应用程序,所以我不想为图片使用网址。
  • 然后将它们保存在您的服务器可访问的某个目录(静态文件)中,并将路径添加到您的数据库中的静态文件?
  • 这就是问题所在。图像已经在一个目录中。请再次检查我的代码。 @KevinEaverquepedo
  • @CEO 如果您只保存文件名,那么在 photopath 列中使用 varbinary 有什么意义?列数据类型应更改为 nvarchar,因为文件名是 unicode 字符串,而不是二进制数据。那么就不需要转换任何东西了。使用 varbinary 的唯一原因是您希望数据库本身存储图像数据(即文件内容)。

标签: python sql database pyqt5 varbinary


【解决方案1】:

经过近 10 个小时的深入研究和批判性思考,我终于能够解决它。错误说

  "implicit conversion from data type nvarchar to varbinary(max) 
  is not allowed. use the convert function to run this query."

我尝试了所有给我的建议,但微软 SQL 拒绝了他们,坚持不能隐式进行转换,我的理解是我或用户必须在 SQL 服务器中进行转换并承担责任使用 CONVERT 或 CAST。

我决定重新创建一个表来测试照片上传。该表只给出了 2 列,

   CREATE table pixx2(
        photopath varchar(500),
        photo-p AS CAST(photopath AS varbinary(max))
       )

插入语句是:

           insert into pixx2(photopath) value(?),
           (self.pixTx.text())

pixTx 是上传照片的文件路径文本(字符串值),存入数据库时​​触发 photo-p 列接收副本并保存在 varbinary 中。

我已经实现了我想要的。谢谢。

【讨论】:

  • self.pixTx.text()的返回值是一个unicode字符串。将其转换为 varbinary 毫无意义。为什么将 filepath 存储为 varbinary?如果您想将图像数据存储在您的数据库中,您的代码肯定无法实现。
  • 先生。 @ekhumoro,我创建了另一个表。我使用 insert into self.pixL.text() 和 self.pxTx.text() 其中 self.pixL 是像素图的 QLabel,self.pxTx 是 QLineEdit 来保存文件路径并以表格形式显示。我发现它们都以相同的值存储,即文件的路径。我在数据库服务器内部进行了对话。你能告诉我你正在谈论的图像的插入语句吗?让我看看那个说法。它不是插入到我要使用的 tablename(x,y) 值 (?,?),(self.pixTx.text(), self.pixL.text()) 中吗?我想看看你会用什么
  • self.pixL.text() 的值无关紧要。它与像素图无关。如果你想在你的数据库中存储文件路径和图像数据,你应该这样做:filepath = self.pixTx.text(); imgdata = open(filepath, 'rb').read(); self.cursor.execute("INSERT INTO pixx1(photopath, photop) VALUES(?,?)", (filepath, imgdata))。这假定 photopath 是 varchar 并且 photop 是 varbinary。再说一遍:在将值插入数据库之前,不要尝试以任何方式转换或强制转换。
  • 如果操作正确,就可以使用 select 语句从数据库中获取二进制图像数据,然后直接从中创建像素图,如下所示:pixmap = QPixmap.fromImage(QImage.fromData(imgdata))
  • 我已经给了你确切的代码。我没有其他要补充的。
猜你喜欢
  • 2021-02-23
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多