台灣最大程式設計社群網站
線上人數
1466
 
會員總數:245468
討論主題:189226
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 使用SQL 命令操作 Image 欄位
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
使用SQL 命令操作 Image 欄位
價值 : 0 QP  點閱數:1015 回應數:0

樓主

Sean
初級顧問
13154 8
4634 1522
發送站內信

捐贈 VP 給 Sean
SQLServer 中,使用Image作為DataType的欄位可以不用.NET的SqlParameter 操作 (雖然我也習慣用 Parameter)。
操作Image的 SQL指令,首先必須資料轉換成16進制的字串,再將字串組成SQL指令。
例如:我要新增一張圖片,這張圖片的資料可以由Stream 取得,轉成字串後 INSERT 就沒太大的問題了。

Stream是什麼
一般而言 Stream 和 Byte陣列 具有相似的性質,只是存取方式的差別而已。
先假設photo 是 Byte 陣列而不是Stream

那程式可以寫成

Dim photo(100) as Byte
...
For i = 0 To UBound(photo)
Dim j as Byte = photo(i)
...
Next

或是

Dim photo(100) as Byte
...
For i = 0 To photo.Length - 1
Dim j as Byte = photo(i)
...
Next


將Byte陣列轉成16進制的字串
Byte能代表的數字是0~255,也就是16進制的 &H00, &H01,... &HFE, &HFF
所以每個Byte 轉成字串可以得到兩個字元的字串。
整除 16 可以得到 第一個字元的數,取 16 的餘數 可以得到第二個字元的數。
但得到兩位元的數並不是Char,必須加上 &H30 並且大於 &H39 的數再加上7 才能使用 Chr(integer) 轉換成字元。
可以由下表得知:
引用:

0 => "0" = &H30 (數字0轉成字串"0" 在 ASCII碼以16進制表示是 &H30 也就是十進制的 48)
1 => "1" = &H31
2 => "2" = &H32
3 => "3" = &H33
4 => "4" = &H34
5 => "5" = &H35
6 => "6" = &H36
7 => "7" = &H37
8 => "8" = &H38
9 => "9" = &H39
10 => "A" = &H41
11 => "B" = &H42
12 => "C" = &H43
13 => "D" = &H44
14 => "E" = &H45
15 => "F" = &H46


所以程式可以這樣寫

Dim photo(100) as Byte
Dim str(200) as Char '必須是photo兩倍大的空間
...
For i = 0 To photo.Length - 1
Dim j as Byte = photo(i)
Dim a as Byte

'第一個字元
a = j / &H10 '整除 16
a = a + &H30 '加上 &H30
if (a > &H39) then a += 7 ' 大於 &H39 的數再加上7
str(2*i) = Chr(a)

'第二個字元
a = j mod &H10 '取16的餘數
a = a + &H30 '加上 &H30
if (a > &H39) then a += 7 ' 大於 &H39 的數再加上7
str(2*i+1) = Chr(a)
Next

Dim result as new String(str)


Stream轉字串
不管是FileStream、MemoryStream、OutputStream、InputStream 等,作法都和上面程式類似
只有讀取方法不同而已

Dim photo as new FileStream("C:\test.bmp", FileMode.Open)
Dim str(2*photo.Length) as Char '必須是photo兩倍大的空間
For i = 0 To photo.Length - 1
photo.Position = i ' 其實這行是比較多餘的寫法,只是讀取的位置一定要明確
Dim j as Integer = photo.ReadByte()
Dim a as Integer

'第一個字元
a = j / &H10 '整除 16
a = a + &H30 '加上 &H30
if (a > &H39) then a += 7 ' 大於 &H39 的數再加上7
str(2*i) = Chr(a)

'第二個字元
a = j mod &H10 '取16的餘數
a = a + &H30 '加上 &H30
if (a > &H39) then a += 7 ' 大於 &H39 的數再加上7
str(2*i+1) = Chr(a)
Next

Dim result as new String(str)


組成SQL
Image欄位的新增或修改,就依照上面程式轉成的16進制字串前面再加個 0x 就可以了。
例如
引用:

UPDATE Customer SET pic = 0x424DF60A00000000000036........... WHERE id = 1

所以程式可以寫成

Dim SqlStr as String = "UPDATE Customer SET pic = 0x" & result & " WHERE id = 1"


結語
以上程式都未經過測試
若有錯誤請讀者自行修改
^__________^
本篇文章發表於2006-01-25 01:15
== 簽名檔 ==



-------------------------------------------------
盡力學習,竭力分享,戮力成就
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.