2010-03-28 4 views
3

J'utilise C# et j'ai du mal à charger des fichiers volumineux dans un tableau binaire en utilisant des tableaux d'octets. Fondamentalement, si je charge un fichier qui est trop volumineux, j'ai des problèmes de mémoire.comment charger un fichier dans un blob sans le charger dans la RAM en premier?

Existe-t-il un moyen de charger un fichier dans un champ binaire sans utiliser de grandes quantités de RAM, c'est-à-dire d'éviter de charger le fichier en mémoire en premier? Si cela peut vous aider, j'utilise Advantage Database Server et j'utilise une application WinForms plutôt qu'une application Web.

Cordialement

Répondre

0

Sauf si vous choisissez simplement ajouter une référence dans la base de données à l'endroit où se trouve le fichier, il doit passer par la mémoire d'abord, donc id conseiller à la recherche dans une solution qui charge le fichier x octets à la fois.

0

Je l'ai fait avant d'utiliser "UPDATE .WRITE" Je lis des morceaux du fichier d'un flux et ajoute les données au champ de base de données. Rechercher .WRITE sur cette page: http://msdn.microsoft.com/en-us/library/ms177523.aspx.

Malheureusement c'est pour SQL Server. Je pense qu'Avantage Database Server variera un peu ici, mais peut-être que cela vous enverra dans la bonne direction.

2

Vous pouvez utiliser le moteur client Advantage (ACE) directement et appeler l'API AdsSetBinary pour définir le blob en segments. Désolé, je n'ai pas le temps maintenant d'écrire un exemple pour vous. Vous devrez ajouter ce prototype à votre C# fichier:

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

Et voici un lien vers la référence API C:

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

Pour obtenir la poignée pour passer l'API, reportez-vous Documentation AdsExtendedReader.AdsHandle. J'ai juste vu la réponse d'Alex et c'est mieux que le mien, je ne savais pas que nous avions déjà enveloppé l'appel AdsSetBinary avec une méthode .NET. Vous pourriez marquer sa réponse comme la bonne réponse à cette question. :)

5

Le AdsExtendedReader.SetBytes peut être utilisé pour charger le blob en morceaux. Il encapsule l'appel à AdsSetBinary() que Jeremy a mentionné.

voir AdsExtendedReader.SetBytes.