2012-08-06 2 views
3

SQL Server 데이터베이스의 image 데이터 형식 열에 이진 데이터를 삽입하려고합니다. 선호하는 데이터 형식은 varbinary(max)입니다.하지만 스키마를 변경할 권한이 없습니다.SQL Server 이미지 열에 pyodbc.Binary 데이터 (BLOB) 삽입

어쨌든, 나는 파일의 내용을 읽고있다 아래로() pyodbc.Binary에 포장 :

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

I 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) 

문서 열의 값을 삽입 한 후 그러나

는 16 진수 데이터가 ASCII 문자 코드로 변환 된 것처럼 표시 0x343234353 . . .이다.

pyodbc.Binary()의 값을 줄 바꿈이라고 생각 했습니까? 어떤 도움이라도 대단히 감사하겠습니다.

저는 Python 2.7 및 SQL Server 2008 R2 (10.50)를 사용하고 있습니다.

편집 :

beargle 친절하게 내 문제로 이어지는 한 내가 불필요하게 ('진수') 인 코드를 호출하는 것을 지적했다. 나는 이것이 데이터를 문자열로 강요 했음에 틀림 없다고 생각한다 (더 자세한 설명이 도움이 될지라도).

근무 코드 :

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

나는'SQL Server Native Client 10.0' 드라이버를 사용하고 있으며'SQL Server' 드라이버를 사용하여 동일한 결과를 테스트했습니다. – slachterman

+0

'pyodbc.Binary'로 포장하기 전에 내용을 16 진수로 인코딩해야하는 이유는 무엇입니까? – Bryan

+0

좋은 점, 나는 필요하지 않으며, 제거하면 예상되는 결과로 이어집니다. 감사! – slachterman

답변

4

먼저 당신이 파일 (another example)을 읽을 with open(..)를 사용하십시오. 이렇게하면 파일 개체가 모두 소진되면 자동으로 닫힙니다. 또는 예외가 발생했습니다.

# 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... 데이터를 받고 같은데요 : 데이터가 이런 식으로 저장됩니다

SQL Server Management Studio results

이 말하는 것이 아니라 방법 Management Studio는 결과 창에 image, text, ntext, varbinary 등의 데이터 형식을 나타냅니다.

+0

내 경우에는이 테이블에서 데이터를 읽는 또 다른 응용 프로그램이 있으므로 이진 데이터의 디코딩을 제어 할 수 없습니다. 2 행의 값으로,이 다른 응용 프로그램은 손상된 파일 다운로드를 종료합니다. – slachterman