3

私は C# を使用していますが、バイト配列を使用するバイナリ フィールドに大きなファイルをロードする際に問題が発生しています。

基本的に、大きすぎるファイルをロードすると、メモリの問題が発生します。

大量の RAM を使用せずにファイルをバイナリ フィールドにロードする方法はありますか。つまり、最初にファイルをメモリにロードしないようにする方法はありますか?

それが役立つ場合、私はアドバンテージ データベース サーバーを使用しており、これは Web アプリではなく winforms アプリを使用しています。

よろしく

4

4 に答える 4

5

AdsExtendedReader.SetBytesを使用して、blobをチャンクでロードできます。これは、Jeremyが言及したAdsSetBinary()への呼び出しをカプセル化します。

AdsExtendedReader.SetBytesを参照してください。

于 2010-03-31T17:56:13.223 に答える
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 の回答を見たところ、私の回答よりも優れています。AdsSetBinary 呼び出しが .NET メソッドで既にラップされていることを知りませんでした。彼の答えをこの質問に対する正解としてマークすることをお勧めします。:)

于 2010-03-29T20:31:09.717 に答える
0

ファイルが配置されている場所へのデータベース内の参照を単に追加することを選択しない限り、最初にメモリを通過する必要があるため、一度に x バイトのファイルをロードするソリューションを検討することをお勧めします。

于 2010-03-28T21:09:35.570 に答える
0

「UPDATE .WRITE」を使用する前にこれを行いました。ストリームからファイルのチャンクを読み取り、データをデータベース フィールドに追加します。このページで .WRITE を検索してください: http://msdn.microsoft.com/en-us/library/ms177523.aspx

残念ながら、これは SQL Server 用です。アドバンテージ データベース サーバーはここで少し異なると思いますが、おそらくこれで正しい方向に進むでしょう。

于 2010-03-28T21:18:31.660 に答える