如何将文件加载到Blob中而无需先加载到RAM中?

3

我正在使用C#,在将大文件加载到二进制字段使用字节数组时遇到了问题。

基本上,如果我加载一个太大的文件,就会出现内存问题。

有没有一种方法可以将文件加载到二进制字段中而不使用大量的RAM,即避免首先将文件加载到内存中?

如果有帮助的话,我正在使用Advantage Database Server,这是使用winforms应用程序而不是web应用程序。

谢谢

4个回答

5
AdsExtendedReader.SetBytes可以用来分块加载blob。它封装了Jeremy提到的调用AdsSetBinary()的过程。
请查看AdsExtendedReader.SetBytes

2
您可以直接使用优势客户端引擎(ACE)并调用AdsSetBinary API以分块设置blob。抱歉,我现在没有时间为您编写示例。您需要将此原型添加到您的C#文件中:
[DllImport("ace32.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Winapi )]
              public static extern uint AdsSetBinary( IntPtr hTable, String pucFldName, ushort usBinaryType, uint ulTotalLength, uint ulOffset, byte[] pucBuf, uint ulLen );   

这里是C API参考链接:

http://devzone.advantagedatabase.com/dz/webhelp/Advantage9.1/mergedProjects/ace/api2/adssetbinary.htm

要获取传递给API的句柄,请参阅AdsExtendedReader.AdsHandle文档。

更新:我刚看到Alex的回答,比我的更好,我不知道我们已经用.NET方法包装了AdsSetBinary调用。你可能想将他的答案标记为正确答案。 :)


0

除非您选择仅在数据库中添加到文件位置的引用,否则必须首先通过内存进行操作,因此我建议您查找一种每次加载 x 字节文件的解决方案。


0

我以前用过"UPDATE .WRITE"来完成这个任务。我从流中读取文件块,并将数据附加到数据库字段中。在此页面上搜索.WRITE:http://msdn.microsoft.com/en-us/library/ms177523.aspx

不幸的是,这只适用于SQL Server。我认为Advantage Database Server会有所不同,但也许这会指引你朝着正确的方向前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接