いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

DevExpress奮闘記-047 (InMemoryDataStore)(XPO, DataSet, インメモリデータストア)


これは、v2010の新機能ではないのですが、v2009 vol.3にてXPOに以下のクラスが追加されています。

DevExpress.Xpo.DB.InMemoryDataStore


名前が示す通り、インメモリで利用できるデータストアです。
今までは、DataSetDataStoreと呼ばれていたみたいです。


通常、Xpoではデータベースに接続して処理を行う事がほとんどですが
たまに、インメモリのデータストアがあれば便利な時があります。
そのような時に手軽に利用出来るデータストアとなります。


使い方は、簡単で以下のようにして設定します。

XpoDefault.DataLayer = new SimpleDataLayer(new InMemoryDataStore());


DevExpressのサイトのオンラインドキュメント上は、InMemoryDataStoreのコンストラクタ
DataSetを渡すような記述がありますが、v2010 vol1の版ではそのようなコンストラクタは定義されてません。
そのまま、デフォルトコンストラクタを呼んでしまうのが一番簡単です。


後は、通常のXpoと同じように利用出来ます。
以下のサンプルでは、WinFormのフォームがありその中にGridControlとボタンとMemoEditが
予め配置されています。ボタンが押下されるとデータストアの内容をXMLに一旦出力し、
その後MemoEditに反映させています。


これを見る事で、InMemoryDataStoreの内部にちゃんとデータが登録されていることが分かります。

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using System.Xml;
using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.Utils;
using DevExpress.Xpo;
using DevExpress.Xpo.DB;
using DevExpress.XtraEditors;

namespace InMemoryDataStoreSample
{
    public partial class XtraForm1 : XtraForm
    {
        static InMemoryDataStore _dataStore;

        public XtraForm1()
        {
            InitializeComponent();
        }

        private void XtraForm1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < 1000; i++)
            {
                Session.DefaultSession.Save(new MyData{ Id = i.ToString(), Name = i.ToString(), Age = i });
            }

            gridView1.OptionsBehavior.AutoPopulateColumns = true;
            gridControl1.DataSource = new XPCollection<MyData>();            
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
            //
            // アプリ全体の初期設定.
            //
            UserLookAndFeel.Default.SkinName = "Black";
            SkinManager.EnableFormSkinsIfNotVista();
            AppearanceObject.DefaultFont = new Font("Meiryo UI", 9.75f);

            //
            // InMemoryDataStoreをセットアップ.
            //
            _dataStore = new InMemoryDataStore();
            XpoDefault.DataLayer = new SimpleDataLayer(_dataStore);

            Application.Run(new XtraForm1());
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            //
            // 現在のXPOデータレイヤーでのデータをXMLに出力.
            //
            using (StringWriter writer = new StringWriter())
            {
                using (XmlWriter xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings{ Indent = true }))
                {
                    _dataStore.WriteXml(xmlWriter);
                }

                memoEdit1.EditValue = writer.ToString();
            }
        }
    }

    class MyData : XPLiteObject
    {
        [Key]
        public string Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
}


以下のような感じになります。