python mssql varbin_python – 将pyodbc.Binary数据(BLOB)插入SQL Server映像列

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

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

f = open('Test.ics', 'rb')

ablob = f.read().encode('hex')

ablob = pyodbc.Binary(ablob)

当我打印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).

编辑:

熊女士善意地指出,我不必要地调用编码(‘hex’),这导致了我的问题.我相信这一定是将数据强制转换为字符串(尽管更全面的解释会有所帮助).

工作代码:

ablob = pyodbc.Binary(f.read())

cur.execute(insertSQL, 'test200.ics', 'text/calendar', ablob, 1717)

解决方法:

首先确保使用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在结果窗格中表示image,text,ntext,varbinary等数据类型的方式.

标签:python,sql-server-2008,pyodbc

来源: https://codeday.me/bug/20190620/1248500.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值