この使い方は、プログラミングしていて、自分で作成したクラスオブジェクトが存在し、高速にデータ処理しながら、データが常にディスク保存を伴っているような「ミッション・クリティカル」な使い方が求められる時に役立ちます。関数の実施はVB.NET側で行うことになり、Cache'上にはデータが蓄積されます。クラスは構造を持つことが可能です。関数機能はObjectScriptには翻訳されないので、VB.NET側で記述します。この方法でも、SQLを記述する必要はなく、オブジェクトをそのまま保存できるODBの恩恵が受けられます。
<Cache'側準備>
・Cache'DB内にUserネームスペースが存在することを確認する。(デフォルトのインストールでは存在する)
・管理ポータル→システム管理→サービス→%Service_Callinが有効であることを確認する。(有効=はいにする)
・USERネームスペースが書き込み可能である(読み取り専用チェックが外れている)ことを確認する。


<VB.NET側準備>
プロジェクトを作成し、プロジェクト→プロパティの「アプリケーション」で、ターゲットを.NET Framework 4.0に設定する。(4.5ではADO周りに不安があるため)
また、「アプリケーション フレームワークを有効にする」のチェックを外す(名前空間を意図通りにするために必要)

プロジェクト→参照で
C:\InterSystems\TryCache\dev\dotnet\bin\v4.0.30319から、
InterSystems.Data.CacheClient.dll
InterSystems.CacheExtreme.dll
を参照する。

Cache'側に作成したいクラス構造を記述する。(ここではCacheExtremeTest.vbというクラスファイルで、CacheExtremeTestクラスを記述)
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
機能を実装するクラスを作成する(ここではXEPTest.vbとした)。重要な関数はmyPersister.ImportSchema(className)で、この関数がCache'側にVB.NET側のクラスに合わせた構造を作成する。
保存はnewEvent.Store(eventData)。なお、コード中にコメントアウトしている箇所と入れ替えると、TCP接続もできます。
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
フォームの上にボタンをひとつ作成し、次のように記述する。
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
実行結果は次の通り。Cache'のUSERネームスペース上に、CacheExtremeTest.CacheExtremeTest1というクラス(=テーブル)が作成され、データが保持されます。クラス内にクラスが入っている場合の、フィールドの命名規則に注目します。
(もっとも、オブジェクト指向のみで記述している際には気にする必要はありませんが、DBから呼びたい時に役立ちます)



