【问题标题】:How to read a image by IDataReader如何通过 IDataReader 读取图像
【发布时间】:2011-06-05 22:40:44
【问题描述】:

我在 C# vs05 窗口上工作。我想通过 IDataReader....在 oledb 中读取图像....假设我想从数据库列名学生 id 中读取 int 值然后我用下面的方式编写代码

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);
            }
        }

任何人都可以帮助我吗?我的错误在哪里.....如何解决这个问题

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    尝试类似(确保阅读器处于顺序模式):

    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 时返回的字节数(即假设你有一个完整的块)。

    【讨论】:

    • reader.GetBytes 将返回 long 而 ms.Write 需要一个 int。因此,bytesRead 必须在调用 ms.Write 时转换为 int
    • @comecme 确实你是对的(已修复)——这很愚蠢,因为我们知道它不能读取超过 2GB... 非常奇怪!
    • @Marc,如果您不确定图片的大小怎么办? reader.GetBytes(col, 0, null, 0, 0) 是获取列中字节数的安全方法(尽管未记录),然后您可以为数组分配内存吗?
    • @Mystic - 如果您查看示例,我不知道大小 - 我只是使用缓冲区循环直到我可以'不读任何东西。我不能对reader.GetBytes(col, 0, null, 0, 0) 发表评论——直觉上应该总是返回零。如果不是……我会称之为错误。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2015-10-15
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多