昨天嘗試了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 源代碼