在SQL Server CE中插入较大的图像时出现OutOfMemoryException

时间:2015-04-11 17:11:47

标签: image sql-server-ce windows-mobile-6.5 sql-server-ce-3.5

插入较小的图像可以正常工作。但是,当图像文件大于2MB时,我得到OutOfMemoryException

我尝试使用SqlCeUpdatableRecord和参数化SqlCeCommand。使用SqlCeCommand,会在ExecuteNonQuery()处引发异常。

使用SqlCeUpdatableRecord时会在{​​{1}}处引发异常。

我尝试过增加缓冲区大小和临时文件大小而不会产生影响。我已经使用SqlCeUpdatableRecord.SetBytes()进行了调试,似乎有足够的可用资源。

任何提示都将受到高度赞赏。

SQL Server CE数据库与主SQL Server数据库同步,并将图像作为单独的文件处理会引入大量其他问题。该解决方案已经运行多年,因为大多数WM手持设备仅能以500万像素或更低的速度捕获图像。但是,支持800万像素的新型号正在引发问题。

以下是GetTotalMemory实施的简化版本:

SqlCeUpdateblRecord

以下是参数化查询的简化版本:

System.Data.SqlServerCe.SqlCeUpdatableRecord newRecord = base.CreateRecord();
newRecord["ImageId"] = ImageId;
newRecord["ImageType"] = ImageType;
//64kb buffer (Have tested with different buffer sizes (up to 8MB)
newRecord.SetBytesFromFile("ImageFull", ImageFullFileName, 65536);
newRecord["ImageThumb"] = ImageThumb;
newRecord["ImageDate"] = ImageDate;
base.Insert(newRecord); 

.....
public static void SetBytesFromFile(this SqlCeUpdatableRecord obj, string name, string filename, int buffersize)
{
    int _column = obj.GetOrdinal(name);
    byte[] buffer = new byte[buffersize];            
    int bytesread;
    long offset = 0;

    using (FileStream fs = new FileStream(filename,FileMode.Open))
    {
        bytesread = fs.Read(buffer, 0, buffersize);

        while (bytesread > 0)
        {
            //This will raise OutOfMemoryException for imagefiles larger than appx. 2mb, regardless of buffersize      
            obj.SetBytes(_column, offset, buffer, 0, bytesread);                    
            offset = offset + (long)bytesread;
            bytesread = fs.Read(buffer, 0, buffersize);           
        }
    }
}

0 个答案:

没有答案