2

我正在尝试使用存储过程从使用 pymssql 的金字塔 Web 应用程序中将二进制数据插入 MSSQL 数据库。

相应列的 MSSQL 数据类型是varbinary(max).

我的问题是:MSSQL 数据库的 varbinary 数据类型希望我在插入二进制文件之前对它做什么?

这是我一直在尝试的:

with open(tmp_file, 'rb') as content_file:
    filecontent = content_file.read()

...然后将值传递filecontent给存储过程。

tmp_file在这种情况下是.png文件的有效路径。

MSSQL db 回答以下错误:

*** DatabaseError: (257, 'Implicit conversion from data type varchar to varbinary(max) is not 
allowed. Use the CONVERT function to run this query.DB-Lib error message 257, severity 16:\nGeneral
SQL Server error: Check messages from the SQL Server\n')

我能够将filecontent变量的值插入到 SQLite(varbinary列)和 MySQL 数据库(BLOB列)中,没问题。

为什么它不能与 MSSQL 数据库一起使用?

4

2 回答 2

2

正如@Arno Rinker 指出的那样,从 varchar 到 varbinary 的转换确实存在问题。然而,我最终做了更多的事情来完全解决我的问题。

我在这里发布我的整个解决方案,以防万一......

with open(tmp_file, 'rb') as content_file:
    filecontent = content_file.read()
    filecontent_hex = '0x'.encode('ascii') + binascii.hexlify(filecontent)

    --> post the value of filecontent_hex to a stored procedure.

存储过程接收filecontent_hexas的值varchar,然后将其转换为varbinary

从 MSSQL-DB 中获取二进制数据然后我这样做:

fout = open(filename, "w")
filecontent_unhex = binascii.unhexlify(filecontent)
fout.write(filecontent_unhex[2:])
fout.close()

wherefilenamefilecontentare 在查询存储过程的结果中。

结论:binascii.hexlify()binascii.unhexlify()SQLite 和 MySQL 的二进制交互不需要的地方。然而,这些步骤似乎是与 MSSQL-DB 交互所必需的。

于 2014-09-16T13:11:20.030 回答
1

也许您必须明确转换varchar 。这就是您的错误消息所暗示的。

请参阅:http ://social.msdn.microsoft.com/Forums/sqlserver/en-US/8f9d772a-4fa2-45b4-9fed-f03c73bd757a/implicit-conversion-from-data-type-varchar-to-varbinary-is-不允许使用转换功能到?forum=transactsql

这似乎解决了同样的问题。

于 2014-09-15T13:03:32.890 回答