2009-05-21 8 views
1

私はウィンドウC#vs05で作業します。私はOLEDBで....のIDataReaderによって画像を読みたい....私はそれを行うことができますどのように私は、私は怒鳴る方法IDataReaderで画像を読むには

private IDataReader _reader; 

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

をしてコードを書くデータベース列名の学生証からint値を読みたいと仮定私はいずれかが私を助けることができる怒鳴るコード

 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はlongを返し、ms.Writeはintを返します。したがって、 'bytesRead'はms.Writeの呼び出しで' int'にキャストされなければなりません。 – comecme

+0

@comecme確かにあなたは正しい(固定) - 私たちが知っているように愚かです - それ以上の2GBを読むことはできません...非常に奇妙です! –

+0

@Marc、画像のサイズがわからない場合はどうすればいいですか? reader.GetBytes(col、0、null、0、0)は列のバイト数を取得する安全な方法です(ただし、文書化されていません)。 – Mystic

関連する問題