昨天尝试了adodbapi的常用操作,今天写一个存取二进制图片的程序试试,ado里面存取二进制数据还是要稍复杂点,不知道adodbapi表现又怎么样。
例程功能:
1. 新建一个测试表,用于存储图片数据
2. 读取源图片数据,插入一条记录到测试表
3. 读取新插入的表记录,将二进制字段数据写入到目标文件
4. 直接打开目标图片文件,看看内容是否与源图片一致
1
#coding=utf-8
2
3
import adodbapi
4
class BlobDataTestor:
5
def __init__(self):
6
self.conn = None
7
8
def __del__(self):
9
try:
10
self.conn.close()
11
except:
12
pass
13
14
def connectdb(self, connectString):
15
self.conn = adodbapi.connect(connectString)
16
17
def closedb(self):
18
self.conn.close()
19
20
def setup(self):
21
cursor = self.conn.cursor()
22
cursor.execute("""
23
CREATE TABLE [Dem_Picture] (
24
[ID] [int] IDENTITY (1, 1) NOT NULL ,
25
[PicData] [image] NULL ,
26
CONSTRAINT [PK_Dem_Picture] PRIMARY KEY CLUSTERED
27
(
28
[ID]
29
) ON [PRIMARY]
30
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];""")
31
#self.conn.commit()
32
33
def teardown(self):
34
cursor = self.conn.cursor()
35
try:
36
cursor.execute("Drop Table Dem_Picture")
37
except:
38
pass
39
#self.conn.commit()
40
41
def testRWBlobData(self):
42
#读取源图片数据
43
f = open("C://src.bmp", 'rb')
44
b = f.read()
45
f.close()
46
47
#将图片数据写入表
48
cursor = self.conn.cursor()
49
cursor.execute("INSERT INTO Dem_Picture (PicData) VALUES (?)", (adodbapi.Binary(b),))
50
#self.conn.commit()
51
52
#读取表内图片数据,并写入硬盘文件
53
cursor.execute("SELECT TOP 1 PicData FROM Dem_Picture ORDER BY ID DESC")
54
d = cursor.fetchone()[0]
55
cursor.close()
56
57
f = open("C://dst.bmp", "wb")
58
f.write(d)
59
f.close()
60
61
62
if __name__ == "__main__":
63
test = BlobDataTestor()
64
test.connectdb("Provider=SQLOLEDB.1;Persist Security Info=True;Password=;User ID=sa;Initial Catalog=pubs;Data Source=.")
65
try:
66
test.setup()
67
test.testRWBlobData()
68
test.teardown()
69
finally:
70
test.closedb()
71
程序说明:
1. 存取二进制数据的关键在于将数据对象转换为 adodbapi.Binany 数据类型
2. 因为是测试程序,所以没有提交事务,不影响测试库
总结:
adodbapi操作二进制数据明显比ADO简单很多,只需要做下数据类型转换即可。
参考资料:
1. PEP-0249
2. adodbapi 源代码
5734





