2009-05-21 62 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