2009-05-21 3 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는 ms.Write가 int를 기다리는 동안 long을 반환합니다. 그래서'bytesRead'는 ms.Write에 대한 호출에서'int'로 형변환되어야합니다. – comecme

+0

@comecme 실제로 당신은 정확합니다 (고정) - 우리가 * 아는 바보처럼 * 더 이상 2GB를 읽을 수는 없습니다 ... 아주 이상합니다! –

+0

@Marc, 이미지의 크기가 확실하지 않은 경우 어떻게해야합니까? reader.GetBytes (col, 0, null, 0, 0)는 열에있는 바이트 수를 얻기위한 안전한 방법이지만 (문서화되어 있지는 않지만) 배열에 메모리를 할당 할 수 있습니까? – Mystic