如何阅读形象的IDataReader [英] How to read a image by IDataReader
问题描述
我的工作窗口C#VS05。我想读一个形象的IDataReader ....在OLEDB ....我怎么能做到这一点假设我要读取数据库中列名学生的ID int值,然后我写code在波纹管的方式
I work on window C# vs05. i want to read a image by IDataReader....in oledb....how can i do it suppose i want to read int value from database column name student id then i write code in bellow way
private IDataReader _reader;
public int GetInt32(String sFieldName)
{
return (_reader[sFieldName]==DBNull.Value)? (Int32) 0 :Convert.ToInt32(_reader[sFieldName]);
}
要保存图像我用波纹管code
To save the image i use bellow code
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);
}
}
任何一个可以帮助我吗?我的错误.....如何解决这个问题
can any one help me ?Where is my bug.....How to solve this problem
推荐答案
尝试像(确保读者在连续模式):
Try something like (ensuring that the reader is in sequential mode):
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);
}
我可以在原来的code看到的最大的problm没有看太多假设你有一个每次调用返回到的GetBytes
字节(即数整个块)。
The biggest problm I can see in the original code is not looking too much at the number of bytes returned per call to GetBytes
(i.e. assuming you got a whole chunk).
这篇关于如何阅读形象的IDataReader的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!