2009-05-21 38 views
1

我在窗口C#vs05上工作。我想讀通過IDataReader的一個圖像....在OLEDB ....我怎麼能做到這一點假設我要讀取數據庫中列名學生ID int值,然後我寫的代碼在波紋管的方式如何通過IDataReader讀取圖像

private IDataReader _reader; 

public int GetInt32(String sFieldName) 
     { 
      return (_reader[sFieldName]==DBNull.Value)? (Int32) 0 :Convert.ToInt32(_reader[sFieldName]); 
     } 

要保存圖像我用波紋管代碼

 DataTable oTable = new DataTable(); 
        oTable.Columns.Add("BoardImage"); 
        DataRow oRow = oTable.NewRow(); 
        oRow["BoardImage"] = oItem.BoardImage; 
       SQL= Insert into table oRow["BoardImage"]; 



Now i want to read image BY Idatareader ......to do that i write bellow code but i get error message "Parameter is not valid." 



    public Image GetImage(String sFieldName) 
     { 
      try 
      { 
       //MemoryStream stream = new MemoryStream(); 
       //stream.Write(image, 0, image.Length); 
       //Bitmap bitmap = new Bitmap(stream); 

       byte[] imageData = null; 
       long byteSize = 0; 
       byteSize = _reader.GetBytes(_reader.GetOrdinal(sFieldName), 0, null, 0, 0); **//May be error occur here** 

       imageData = new byte[byteSize]; 
       long bytesread = 0; 
       int curpos = 0, chunkSize = 500; 
       while (bytesread < byteSize) 
       { 
        // chunkSize is an arbitrary application defined value 
        bytesread += _reader.GetBytes(_reader.GetOrdinal(sFieldName), curpos, imageData, curpos, chunkSize); 
        curpos += chunkSize; 
       } 

       byte[] imgData = imageData; 

       MemoryStream ms = new MemoryStream(imgData); **//May be error occur here** 
       Image oImage = Image.FromStream((Stream)ms); 
       return oImage;  



      } 
      catch(Exception ex) 
      { 
       throw new Exception("Failed to get Image: " + ex.Message); 
      } 
     } 

任何一個能幫助我嗎?我的錯誤.....如何解決這個問題

回答

4

試着這麼做(確保讀者在連續模式):

using(MemoryStream ms = new MemoryStream()) { 
    const int BUFFER_SIZE = 1024; 
    byte[] buffer = new byte[BUFFER_SIZE]; 
    int col = reader.GetOrdinal(fieldName), bytesRead, offset = 0; 
    while((bytesRead = (int)reader.GetBytes(col,offset,buffer,0,BUFFER_SIZE)) > 0) { 
     ms.Write(buffer, 0, bytesRead); 
     offset += bytesRead; 
    } 
    ms.Position = 0; 
    return Image.FromStream(ms); 
} 

我在原始代碼中看到的最大問題並不是看每個調用GetBytes返回的字節數太多(即,假設你有一個大塊)。

+0

reader.GetBytes將返回很長時間ms.Write期望一個int。所以`bytesRead`必須在調用ms.Write時轉換爲`int`。 – comecme 2011-06-05 13:35:42