VB.NETでInterSystems Cache' eXTremeを実装する

この使い方は、プログラミングしていて、自分で作成したクラスオブジェクトが存在し、高速にデータ処理しながら、データが常にディスク保存を伴っているような「ミッション・クリティカル」な使い方が求められる時に役立ちます。関数の実施はVB.NET側で行うことになり、Cache'上にはデータが蓄積されます。クラスは構造を持つことが可能です。関数機能はObjectScriptには翻訳されないので、VB.NET側で記述します。この方法でも、SQLを記述する必要はなく、オブジェクトをそのまま保存できるODBの恩恵が受けられます。


＜Cache'側準備＞
・Cache'DB内にUserネームスペースが存在することを確認する。（デフォルトのインストールでは存在する）
・管理ポータル→システム管理→サービス→%Service_Callinが有効であることを確認する。（有効=はいにする）
・USERネームスペースが書き込み可能である（読み取り専用チェックが外れている）ことを確認する。
![20180903-9.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/be24d2b0-5142-92ab-6563-df2167ea25c5.png)
![20180903-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/14458ca7-cd76-2427-52b0-3b14c90bd506.png)


＜VB.NET側準備＞
プロジェクトを作成し、プロジェクト→プロパティの「アプリケーション」で、ターゲットを.NET Framework 4.0に設定する。(4.5ではADO周りに不安があるため)
また、「アプリケーション フレームワークを有効にする」のチェックを外す（名前空間を意図通りにするために必要）
![20180903-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/5b13e04e-4b5d-2947-784b-a28662f0b190.png)


プロジェクト→参照で
C:\InterSystems\TryCache\dev\dotnet\bin\v4.0.30319から、
InterSystems.Data.CacheClient.dll
InterSystems.CacheExtreme.dll
を参照する。
![20180903-10.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/8d61be4d-6b54-cbb0-c0d9-c1ab28954643.png)

Cache'側に作成したいクラス構造を記述する。（ここではCacheExtremeTest.vbというクラスファイルで、CacheExtremeTestクラスを記述）

```vb:CacheExtremeTest.vb
Public Class CacheExtremeTest

    Public myString As String
    Public myAddress As Address

    Public Shared Function generateSampleData(objectCount As Integer) As CacheExtremeTest()

        Dim data As CacheExtremeTest()
        ReDim data(objectCount)

        Dim i As Integer
        For i = 0 To objectCount
            data(i) = New CacheExtremeTest()
            data(i).myString = CStr(i) + "@.NET eXtreme"
            data(i).myAddress = New Address() '動的生成の実例
            data(i).myAddress.city = CStr(i) + "th City"
        Next i
        Return data
    End Function

End Class

Public Class Address
    Public street As String
    Public city As String
    Public state As String
End Class

```

![20180903-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/caffbed7-1d66-4368-c644-496804c183ee.png)


機能を実装するクラスを作成する（ここではXEPTest.vbとした）。重要な関数はmyPersister.ImportSchema(className)で、この関数がCache'側にVB.NET側のクラスに合わせた構造を作成する。
保存はnewEvent.Store(eventData)。なお、コード中にコメントアウトしている箇所と入れ替えると、TCP接続もできます。

```vb:XEPTest.vb

Imports InterSystems.XEP
Imports CacheExtremeTest2.CacheExtremeTest

Public Class XEPTest
    Private Shared className As String = "CacheExtremeTest2.CacheExtremeTest"
    Private Shared eventData() As CacheExtremeTest = CacheExtremeTest2.CacheExtremeTest.generateSampleData(12)

    Public Sub ExtremeFunc()

        Try
            Console.WriteLine("Connecting and importing schema for " + className)
            'eXtreme接続
            Dim myPersister As EventPersister = PersisterFactory.CreatePersister()
            Dim namespc As String = "USER"
            Dim username As String = "yourname"
            Dim password As String = "yourpass"

            myPersister.Connect(namespc, username, password)
            '参考:TCPで接続したくなった場合、Connectを次の呼び方に変更
            'Dim host As String = "127.0.0.1"
            'Dim port As Integer = 1972
            'myPersister.Connect(host, port, namespc, username, password)

            Try ' delete any existing SingleStringSample events, Then import New ones
                'myPersister.DeleteExtent(className) '一度DB内のデータを削除したい場合
                InterSystems.XEP.Event.IsEvent(className)
                myPersister.ImportSchema(className)

            Catch ex1 As XEPException
                Console.WriteLine("import failed:\n")
            End Try

            Dim newEvent As [Event] = myPersister.GetEvent(className)
            Dim itemIDs As Long() = newEvent.Store(eventData) '  // store array Of events

            'newEvent.Close()
            myPersister.Close()

        Catch ex2 As XEPException
            Console.WriteLine("Event storage failed:\n")
        End Try

    End Sub
End Class
```
![20180903-6.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/165f241e-f22d-5526-3756-85690d926b8e.png)

フォームの上にボタンをひとつ作成し、次のように記述する。

```vb:Form1.vb

Imports System
Imports InterSystems.XEP
Imports CacheExtremeTest2.CacheExtremeTest
Imports CacheExtremeTest2.XEPTest

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim d As New CacheExtremeTest2.XEPTest()
        d.ExtremeFunc()

    End Sub
End Class
```

![20180903-7.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/2383d65f-ba0a-6c23-074e-d1733ca9b82b.png)

実行結果は次の通り。Cache'のUSERネームスペース上に、CacheExtremeTest.CacheExtremeTest1というクラス（＝テーブル）が作成され、データが保持されます。クラス内にクラスが入っている場合の、フィールドの命名規則に注目します。
（もっとも、オブジェクト指向のみで記述している際には気にする必要はありませんが、DBから呼びたい時に役立ちます）

![20180903-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/2359304d-f363-8001-873d-fd960189df77.png)