插入较小的图像可以正常工作。但是,当图像文件大于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);
}
}
}