如何在不先装入RAM的情况下将文件加载到blob中?

时间:2010-03-28 21:03:54

标签: c# .net advantage-database-server

我正在使用C#,我无法将大文件加载到二进制字段中使用字节数组。

基本上,如果我加载的文件太大,我会遇到内存问题。

有没有办法在不使用大量ram的情况下将文件加载到二进制字段中,即避免先将文件加载到内存中?

如果有帮助,我使用的是Advantage Database Server,这是使用winforms应用而不是网络应用。

此致

4 个答案:

答案 0 :(得分:5)

AdsExtendedReader.SetBytes可用于以块的形式加载blob。它封装了Jeremy提到的对AdsSetBinary()的调用。

请参阅AdsExtendedReader.SetBytes

答案 1 :(得分:2)

您可以直接使用Advantage Client Engine(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调用。您可能希望将其答案标记为此问题的正确答案。 :)

答案 2 :(得分:0)

除非您选择简单地在数据库中添加文件所在的位置,否则它必须首先通过内存,因此id建议查找一次加载文件x个字节的解决方案。

答案 3 :(得分:0)

我在使用“UPDATE .WRITE”之前已经这样做了。我从流中读取了文件的块并将数据附加到数据库字段。在此页面上搜索.WRITE:http://msdn.microsoft.com/en-us/library/ms177523.aspx

不幸的是,这是针对SQL Server的。我认为Advantage Database Server在这里会有所不同,但也许这会让你朝着正确的方向前进。