2012-05-21 17 views
0

H!我試圖在DB2數據庫中上傳圖像。 圖片大小爲JPG(6.76 kb - 6924字節)。圖像上載和從DB2檢索

該數據庫表具有長度1048576

的BLOB字段我的代碼插入圖像如下:

If fileup.PostedFile IsNot Nothing AndAlso fileup.PostedFile.FileName <> "" Then 
    Dim imagesize As Byte() = New Byte(fileup.PostedFile.ContentLength - 1) {} 
    Dim uploadedimage1 As HttpPostedFile = fileup.PostedFile 

    uploadedimage1.InputStream.Read(imagesize, 0, CInt(fileup.PostedFile.ContentLength)) 

    Dim uploadedimage2 As New OleDbParameter("@Image", OleDbType.VarBinary, imagesize.Length) 
    uploadedimage2.Value = imagesize 

    Dim cmd As New OleDbCommand() 
    cmd.CommandText = "INSERT INTO xxx_TBL(x, IMAGE) VALUES (?, ?)" 
    cmd.Parameters.Add(x) 
    cmd.Parameters.Add(uploadedimage2) 

    cmd.Connection = clsDatabase.Open_DB() 
    Dim result As Integer = cmd.ExecuteNonQuery() 
    If result > 0 Then 
     Return True 

的圖像被插入到數據庫中。

的代碼從數據庫中獲取的圖像,變成一個DataTable,然後將其結合到一個GridView上顯示的網頁爲如下:

Dim cmd As New OleDbCommand() 

cmd.CommandText = "SELECT x, IMAGE FROM xxx_TBL WHERE y = 1" 

cmd.Connection = clsDatabase.Open_DB() 
Dim dReader As OleDbDataReader 
dReader = cmd.ExecuteReader(CommandBehavior.CloseConnection) 

Dim dt As New DataTable 
dt.Columns.Add(New DataColumn("Comments", GetType(String))) 
dt.Columns.Add(New DataColumn("Picture", GetType(Bitmap))) 

Do While (dReader.Read()) 
    Dim dr As DataRow = dt.NewRow() 

    dr("Comments") = dReader(0).ToString 
    Dim imageobj = dReader(1) 
     Using ms As New System.IO.MemoryStream 
      Dim bm As Bitmap 
      Dim bytearray = DirectCast(imageobj, Byte()) 
      ms.Write(bytearray, 0, bytearray.length) 
      bm = New Bitmap(ms) 
      dr("Picture") = bm 
     End Using 

    dt.Rows.Add(dr) 
Loop 

GridView1.DataSource = dt 
GridView1.DataBind() 

X來自數據庫細,並且是顯示。但是,我沒有得到任何圖片 - 只是一個小的「失蹤圖片(白底紅十字)圖標」。

在檢查數據庫時,BLOB字段中圖像的長度爲8192.但是,將其複製到'TEST'文件(無擴展名)時,其大小爲13848字節。我猜這可能是因爲DB2讀取/編碼圖像二進制文件的方式,但我不確定。 有人可能請突出顯示錯誤的可能原因?有關使這項工作或調試的任何建議?

回答

0

我不熟悉DB2,但由於您能夠顯示comments,因此應該正確閱讀您的image。假設您的image數據也存儲正確,您的代碼將不會在瀏覽器中顯示它們,因爲它們需要一點不同的注意,然後comments。每張圖片需要額外的HTTP請求到您的服務器,因此您必須創建那些<img src=myImg.png>標籤來代替圖片持有者。

在你的dt,你不需要實際的圖像數據,你只需要圖像的ID,因爲你需要使用HttpHandler來檢索圖像,然後流到瀏覽器。

首先,您需要在GivdView1的圖像列中輸入<img>標記。

然後,在數據綁定過程中,確保將其更新到<img src="MyHttpHandler.ashx?id=1"/>,當然,ID值必須是動態的。

現在,一個新的文件Generic Handler添加到您的Visual Studio項目,並命名爲MyHttpHandler.ashx和代碼類似下面:現在

public class MyHttpHandler : IHttpHandler 
{  
    public void ProcessRequest(HttpContext context) 
    { 
     string sid = context.Request.QueryString["id"]; 
     int id = -1; 
     if(int.TryParse(sid, out id) && id > 0){ 
      cmd.CommandText = "SELECT IMAGE FROM xxx_TBL WHERE ID=" + id.ToString() + ";"; 
      byte[] img = dr["IMAGE"]; 
      context.Response.ContentType = "image/png"; 
      context.Response.BinaryWrite(img); 
     } 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 

,GridView控件呈現HTML後,瀏覽器會爲所有的HTTP請求圖像和你的MyHttpHandler.ashx將流回每個圖像瀏覽器顯示。

+0

如果正在使用的SQL的「WHERE」子句具有多個參數,我該如何進行此項工作。 我的意思是,對於HttpHandler來說,SQL就像是SELECT IMAGE FROM xxx_TBL WHERE vendor = x,report = y和SEQ = 1。 圖像按供應商,每份報告存儲,按序號(SEQ)排序。 如果我遞增SEQ號。在一個循環中,我如何確定HttpHandler將返回與我正在返回的其他數據相對應的圖像,如圖片註釋。 –

+0

是否有可能獲得在HttpHandler中生成的整個DataTable? –

+0

爲了讓你的想法,以下是數據庫表中的列: '報告編號(唯一), 供應商編號, 圖像評論, 圖片, 圖像序列No.' 可以有每個報告多幅圖像,所以SEQ號碼。給出了與其他列標題相關的順序。它的類型爲INTEGER,從1-'n'出現,其中'n'將是數據庫中同一報表編號的行數(每個圖像一行) –