【问题标题】:Inserting pyodbc.Binary data (BLOB) into SQL Server image column将 pyodbc.Binary 数据 (BLOB) 插入 SQL Server 图像列
【发布时间】:2012-08-06 22:33:32
【问题描述】:

我正在尝试将二进制数据插入到 SQL Server 数据库中 image 数据类型的列中。我知道varbinary(max) 是首选数据类型,但我无权更改架构。

无论如何,我正在读取文件的内容并将其包装在 pyodbc.Binary() 中,如下所示:

f = open('Test.ics', 'rb')
ablob = f.read().encode('hex')
ablob = pyodbc.Binary(ablob)

当我print repr(ablob) 时,我看到了正确的值bytearray(b'424547494e3a5 . . .(添加了省略号)。

但是插入后

insertSQL = """insert into documents(name, documentType, document, customerNumber) values(?,?,?,?)"""
cur.execute(insertSQL, 'test200.ics', 'text/calendar', pyodbc.Binary(ablob), 1717)

文档列的值为0x343234353 . . .,看起来好像十六进制数据已转换为 ASCII 字符代码。

我认为将值包装在 pyodbc.Binary() 中会解决这个问题吗?任何帮助将不胜感激。

我正在使用 Python 2.7 和 SQL Server 2008 R2 (10.50)。

编辑

beargle 好心地指出我不必要地调用了 encode('hex'),这导致了我的问题。我相信这一定是将数据强制转换为字符串(尽管更全面的解释会有所帮助)。

工作代码:

ablob = pyodbc.Binary(f.read())
cur.execute(insertSQL, 'test200.ics', 'text/calendar', ablob, 1717)

【问题讨论】:

  • 我正在使用SQL Server Native Client 10.0 驱动程序,并且也使用SQL Server 驱动程序进行了测试,结果相同。
  • 为什么在用pyodbc.Binary包装之前需要对内容进行十六进制编码?
  • 好点,我不需要,删除导致预期结果。谢谢!
  • 很高兴听到。我确实使用十六进制编码得到了这个,你只需要解码选择结果。

标签: python sql-server-2008 pyodbc


【解决方案1】:

首先确保您使用with open(..) 来读取文件(another example)。这会在文件对象用尽时自动关闭它们引发异常。

# common vars
connection = pyodbc.connect(...)
filename = 'Test.ics'
insert = 'insert into documents (name, documentType, document, customerNumber)'

# without hex encode
with open(filename, 'rb'):
    bindata = f.read()

# with hex encode
with open(filename, 'rb'):
    hexdata = f.read().encode('hex')

# build parameters
binparams = ('test200.ics', 'text/calendar', pyodbc.Binary(bindata), 1717)
hexparams = ('test200.ics', 'text/calendar', pyodbc.Binary(hexdata), 1717)

# insert binary
connection.cursor().execute(insert, binparams)
connection.commit()

# insert hex
connection.cursor().execute(insert, hexparams)
connection.commit()

# print documents
rows = connection.cursor().execute('select * from documents').fetchall()
for row in rows:
    try:
        # this will decode hex data we inserted
        print str(row.document).decode('hex')
    # attempting to hex decode binary data throws TypeError
    except TypeError:
        print str(row.document)

我猜您是通过在 Management Studio 中查看结果来获取 0x343234353... 数据的:

这并不意味着数据以这种方式存储,它只是 Management Studio 在结果窗格中表示imagetextntextvarbinary 等数据类型的方式。

【讨论】:

  • 在我的情况下,有另一个应用程序从这个表中读取数据,所以我无法控制二进制数据的解码。使用第 2 行中的值,此其他应用程序最终会下载损坏的文件。
猜你喜欢
  • 2014-03-03
  • 2012-05-20
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2014-03-03
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多