1

この質問で公開されているように、逆変換を行うだけです。

私は MemoryStream を持っていて、それを SQL CE データベースの System.Data.Linq Binary フィールドに格納したいと考えています (参考までに、最初に EF コードを使用しています)。

MemoryStream は実際には XML であり、String フィールドの最大サイズよりも大きいため、バイナリに格納する以外に方法がありませんでした (このテーマに関する提案は本当に高く評価されています)。

私のコード(適応)

   private Stream _userLayout;
   _userLayout = new MemoryStream();
   DXGridControl_Table.SaveLayoutToStream(_userLayout);
   MyDatabse.SomeTable.SomeBinaryField = _userLayout.????
4

3 に答える 3

4

MemorySteamクラスにはToArray()メソッドがあります:

MemoryStream.ToArray Method:

Position プロパティに関係なく、ストリームの内容をバイト配列に書き込みます。

このメソッドは、MemoryStream の内容のコピーをバイト配列として返します。現在のインスタンスが提供されたバイト配列で構築された場合、このインスタンスがアクセスできる配列のセクションのコピーが返されます。詳細については、MemoryStream コンストラクターを参照してください。

このメソッドは、MemoryStream が閉じているときに機能します。

暗黙的な変換が利用できるためインスタンスbyte[]を簡単に取得できます。BinaryByte[]Binary

MyDatabse.SomeTable.SomeBinaryField = (Binary) _userLayout.ToArray();
于 2013-03-30T11:56:12.637 に答える
3

まずある

        byte[] buffer = new byte[LENGTH];
        MemoryStream memoryStream  = new MemoryStream(buffer);

あなたの例では、使用できます

        DXGridControl_Table.SaveLayoutToStream(_userLayout);
        byte[] doSomethingwithyourData = _userLayout.GetBuffer();
        var length = _userLayout.Length;

その情報を使用して、バイナリデータを何にでも書き込むことができます。

バッファーには、未使用の可能性がある割り当てられたバイトが含まれていることに注意してください。たとえば、文字列 "test" が MemoryStream オブジェクトに書き込まれた場合、GetBuffer から返されるバッファーの長さは 4 ではなく 256 で、252 バイトが未使用です。バッファー内のデータのみを取得するには、ToArray メソッドを使用します。ただし、ToArray はメモリ内にデータのコピーを作成します。

または

Binary binary = new Binary(_userLayout.ToArray());

他の回答のように、バイナリには暗黙の変換があります。

public static implicit operator Binary(byte[] value) {
    return new Binary(value); 
}

例をリクエストしました。使用法についてのちょっとした例:

namespace Stackoverflow.Hannish.SaveLayout
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        /// <summary>
        /// Here we store the layout data as a string. This is the data, that
        /// gets saved to disk / database / etc.
        /// </summary>
        private string layoutdata = string.Empty;

        public Form1()
        {
            this.InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Just some FooBar data.
            var data = new List<DataValue>
                           {
                               new DataValue { Id = 1, Name = "Xyz", IsCool = true }, 
                               new DataValue { Id = 2, Name = "Abc", IsCool = false }
                           };

            this.gridControl1.DataSource = data;
        }

        private void bnLoadLayout_Click(object sender, EventArgs e)
        {
            using (var stream = new MemoryStream())
            {
                var strdata = Encoding.Default.GetBytes(this.layoutdata);
                stream.Write(strdata, 0, strdata.Length);
                stream.Seek(0, SeekOrigin.Begin);
                this.gridView1.RestoreLayoutFromStream(stream);
            }
        }

        private void bnSaveLayout_Click(object sender, EventArgs e)
        {
            using (var stream = new MemoryStream())
            {
                this.gridView1.SaveLayoutToStream(stream);
                this.layoutdata = Encoding.Default.GetString(stream.ToArray());
            }
        }
    }
}

そして、ファイルマジックへのいくつかのバイト:

    private void bnLoadBinLayout_Click(object sender, EventArgs e)
    {
        using (FileStream fstream = File.Open("Layoutdata.bin", FileMode.Open))
        {
            int length = (int)fstream.Length;
            byte[] buffer = new byte[length];
            fstream.Read(buffer, 0, length);

            var memstream = new MemoryStream(buffer);
            this.gridView1.RestoreLayoutFromStream(memstream);
        }
    }

    private void bnSaveBinLayout_Click(object sender, EventArgs e)
    {
        using (FileStream fstream = File.Create("Layoutdata.bin"))
        {
            var memstream = new MemoryStream();
            this.gridView1.SaveLayoutToStream(memstream);
            fstream.Write(memstream.GetBuffer(), 0, (int)memstream.Length);
        }
    }

...例として。DevExpress GridView は、SaveLayoutToXml(); を使用してレイアウト自体を保存できます。

于 2013-03-30T12:03:38.513 に答える