Python例程:使用adodbapi存取二进制数据
昨天尝试了adodbapi的常用操作,今天写一个存取二进制图片的程序试试,ado里面存取二进制数据还是要稍复杂点,不知道adodbapi表现又怎么样。
例程功能:
1. 新建一个测试表,用于存储图片数据
2. 读取源图片数据,插入一条记录到测试表
3. 读取新插入的表记录,将二进制字段数据写入到目标文件
4. 直接打开目标图片文件,看看内容是否与源图片一致
1#coding=utf-8
2
3import adodbapi
4class 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
62if __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 源代码
只用一样东西,而不明白它的道理,实在不高明。