2010-12-17 148 views
1

親愛的所有人,我在流數據庫中遇到問題。
我已經在那裏寫了一個圖像,現在我想回憶並將它放在PictureBox中。
有沒有人可以告訴我最好的做法?
非常感謝您提前。從流數據庫中讀取圖像

+0

是否有任何理由不讓圖像保存在FileSystem中並將元數據保存在dbase中?使用'FileSystem'更容易 – Xaqron 2010-12-17 17:48:16

回答

1

IMO最簡單的方法是從數據庫中讀取所有數據並將其寫入MemoryStream。快退流(設置Position=0),然後使用new Bitmap(stream)Image.FromStream。請注意,您應該而不是處置流...位圖有效「擁有」流後,您已經構建它。

+0

謝謝你,這是我的第一個想法,但我正在尋找比這更好的東西(如果有的話)。 – 2010-12-17 17:38:09

+0

@Lefteris:你在尋找什麼樣的「更好」?你對這個解決方案有什麼不喜歡的? – 2010-12-17 17:38:50

+0

這不是我不喜歡的,但如果還有其他的東西。據我所知,這是最好的做法。非常感謝你。 – 2010-12-17 17:41:28

2
  1. 加州的ExecuteNonQuery方法來獲取與圖像的字節數組
  2. 創建字節數組圍繞一個新MemoryStream(不破壞流作爲Image對象將繼續使用它)
  3. 呼叫Image.FromStream讀取流
  4. 將此圖片設置爲PictureBox的Image屬性。
1

當圖像很小或流量不重要時,上述任何一種方法都能正常工作,並且它們的分辨率很高。由於所有這些解決方案都要求將整個圖像作爲字節數組存儲在內存中,所以隨着圖像大小的增加,事情開始變得無法控制。如果服務器上的負載很重要,那麼將所有這些圖像文件副本佔用有價值的進程地址空間的空間會增加,並且會顯着影響性能。

可能從流語義數據庫讀取,使沒有該文件的完整副本都保存在內存中:

爲DataReader提供一種處理 句柄的行,其中包含具有 較大二進制值的列。加載整行而不是 , SequentialAccess使 DataReader能夠將數據加載爲流。 然後,您可以使用GetBytes或 GetChars方法來指定開始讀取操作的位置 位置,並且返回數據 的有限緩衝區大小。

最後一點是一個小問題。您可以將流寫入虛擬映射到該站點的WWW服務器本地文件夾,然後將URL返回到該文件。或者你可以有一個URL來讀取圖片本身,並將圖像直接寫入ASP輸出緩存。第一種方法可以爲經常訪問的映像付錢,因爲緩存文件可以服務多個請求,但它需要失效和清理邏輯。第二種方法更適合於無消息訪問的圖像,但需要在應用程序中使用適當的路由邏輯。

當事情開始變得非常熱時,在封送這些圖像時線程被阻塞的問題開始出現,您將不得不移動到Asynchronous pages,這是一個適合流式複製語義的模型。

+0

@Remus Rusanu。我嘗試使用您的解決方案,但我面臨一些問題。這是顯而易見的,有些地方我錯了。所以請協助我: – 2010-12-20 09:02:50

+0

Dim readSQLcomm As SqlCommand。 Dim imgReader As SqlDataReader。 Dim imgBuffer()As Byte。昏暗的imgStream作爲FileStream。 – 2010-12-20 09:04:10

+0

readSQLcomm =新的SqlCommand(「SELECT」&tName&「_Image WHERE」&tName&「Parent_ID ='」&imgID&「'」,SQLConn) – 2010-12-20 09:04:31