2008-10-08 66 views

回答

1

假設:

  • 您使用的是微軟的客戶端(System.Data.OracleClient)。
  • 你有一個合適的OracleConnection實例(connection)。
  • 您準備好了OracleCommandcommand,根據SELECT my_blob FROM my_table WHERE id=xx)。

這應該是這樣的:

using (OracleDataReader odr=command.ExecuteReader()) 
{ 
    reader.Read(); 

    if (!dr.IsDBNull(0)) 
     using (Stream s=(Stream)dr.GetOracleValue(0)) 
      using (Image image=Image.FromStream(s)) 
       return Copy(image); 
} 

,其中複製是

public static Image Copy(Image original) 
{ 
    Image ret=new Bitmap(original.Width, original.Height); 
    using (Graphics g=Graphics.FromImage(ret)) 
    { 
     g.DrawImageUnscaled(original, 0, 0); 
     g.Save(); 
    } 

    return ret; 
} 

爲什麼副本是必要見my blog post和/或KB 814675

0

我知道這使用SQL但它應該爲您的需求

Dim cn As SqlConnection = Nothing 
     Dim cmd As SqlCommand = Nothing 
     Dim da As SqlDataAdapter = Nothing 
     Dim ms As MemoryStream = Nothing 
     Dim dsImage As Data.DataSet = Nothing 
     Dim myBytes() As Byte = Nothing 
     Dim imgJPG As System.Drawing.Image = Nothing 
     Dim msOut As MemoryStream = Nothing 

     Try 
      cn = New SqlConnection(ConnectionStrings("conImageDB").ToString) 
      cmd = New SqlCommand(AppSettings("sprocGetImage").ToString, cn) 
      cmd.CommandType = Data.CommandType.StoredProcedure 

      cmd.Parameters.AddWithValue("@dmhiRowno", irowno) 

      da = New SqlDataAdapter(cmd) 

      dsImage = New Data.DataSet 
      da.Fill(dsImage, "image") 

      If dsImage.Tables(0).Rows.Count = 0 Then 
       Throw New Exception("No results returned for rowno") 
      End If 
      myBytes = dsImage.Tables(0).Rows(0)("Frontimage") 

      ms = New MemoryStream 
      ms.Write(myBytes, 0, myBytes.Length) 

      imgJPG = System.Drawing.Image.FromStream(ms) 

      'Export to JPG Stream 
      msOut = New MemoryStream 
      imgJPG.Save(msOut, System.Drawing.Imaging.ImageFormat.Jpeg) 
      imgJPG.Dispose() 
      imgJPG = Nothing 
      ms.Close() 
      sFrontImage = Convert.ToBase64String(msOut.ToArray()) 

      dsImage = New Data.DataSet 
      da.Fill(dsImage, "image") 
      myBytes = dsImage.Tables(0).Rows(0)("Backimage") 

      ms = New MemoryStream 
      ms.Write(myBytes, 0, myBytes.Length) 

      imgJPG = System.Drawing.Image.FromStream(ms) 
      sBackImage = Convert.ToBase64String(ms.ToArray) 

     Catch ex As System.IO.IOException ' : An I/O error occurs. 
      Throw ex 
     Catch ex As System.ArgumentNullException ': buffer is null. 
      Throw ex 
     Catch ex As System.NotSupportedException ': The stream does not support writing. For additional information see System.IO.Stream.CanWrite.-or- The current position is closer than count bytes to the end of the stream, and the capacity cannot be modified. 
      Throw ex 
     Catch ex As System.ArgumentOutOfRangeException ': offset or count are negative. 
      Throw ex 
     Catch ex As System.ObjectDisposedException ' : The current stream instance is closed. 
      Throw ex 
     Catch ex As System.ArgumentException 
      Throw ex 
     Catch ex As System.Runtime.InteropServices.ExternalException ': The image was saved with the wrong image format 
      Throw ex 
     Catch ex As Exception 
      Throw ex 
     Finally 
      If cn IsNot Nothing Then 
       cn.Close() 
       cn.Dispose() 
       cn = Nothing 
      End If 

      If cmd IsNot Nothing Then 
       cmd.Dispose() 
       cmd = Nothing 
      End If 

      If da IsNot Nothing Then 
       da.Dispose() 
       da = Nothing 
      End If 

      If ms IsNot Nothing Then 
       ms.Dispose() 
       ms = Nothing 
      End If 

      If msOut IsNot Nothing Then 
       msOut.Close() 
       msOut.Dispose() 
       msOut = Nothing 
      End If 

      If dsImage IsNot Nothing Then 
       dsImage.Dispose() 
       dsImage = Nothing 
      End If 

      If myBytes IsNot Nothing Then 
       myBytes = Nothing 
      End If 

      If imgJPG IsNot Nothing Then 
       imgJPG.Dispose() 
       imgJPG = Nothing 
      End If 

     End Try 

此代碼拉回了前面的圖像TIFF包裹JPEG所以代碼比背面用圖像有點不同的是相似的。

相關問題