VB.NETでInterSystems Cache'からデータを読み出す方法

InterSystems Cache'側の準備
Cache’アイコン→スタジオを起動
![20180829-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/161a062a-4b53-2dc0-1693-34f92ac3b9e2.png)
ファイル→新規作成→Cache'クラス定義を選択
![20180829-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/27fec3bf-ab02-9a53-afcc-812060f63f61.png)
クラス名（=テーブル名）を入力（ここではUser.Main.TestClass）
![20180829-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/7f93e61d-bb88-e3e5-6b69-a5f3dd9d5280.png)
%Persistentを選択して完了
User.Main.TestClassに以下のコードを入力

```visualbasic:TestClass.cls
Class User.Main.TestClass Extends %Persistent
{

Property name As %String;

// field name 1

Property age As %Numeric;

// field name 2

Query ByName(str As %String = "") As %SQLQuery(CONTAINID = 1, SELECTMODE = "RUNTIME") [ SqlName = SP_TestClass_By_Name, SqlProc ]
{
   SELECT *
   FROM TestClass
   WHERE (name %STARTSWITH :str)
   ORDER BY ID
}
}
```
![20180829-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/7ffb926c-ab3b-3405-4c5f-27ce0f8d1b89.png)

・データの入力（VB.NETを使って）
前回記事参照
https://qiita.com/torisan_/items/7ad7123409aa27b8c0f0
Visual StudioでObjectBindingでTestClassを出したVB.NETのコードを出力し、取り込んで、(フォームアプリケーションのForm1にボタンを作り)、レコードを作成する。

```visualbasic:Form1

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

        Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
               "Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
               "Password = yourpass; USER ID = yourid"
        Dim cnCache As CacheConnection = New CacheConnection(cacheConnectStr)
        cnCache.Open()


        Dim d As User.Main.TestClass
        d = New User.Main.TestClass(cnCache)
        d.name = "Sakurai Ichiro"
        d.age = 25
        d.Save()
        d.Close()
        d = New User.Main.TestClass(cnCache)
        d.name = "Sakurai Jiro"
        d.age = 32
        d.Save()
        d.Close()
        d.Dispose()
        cnCache.Close()

    End Sub
End class
```
このように2レコードが追加される。
![20180829-6.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/24c7eec6-c610-9f2a-e6e3-f8b3008a981f.png)

ボタンをもう一つつくり、Form1のButton2について次のように記述する。

```visualbasic:Button2

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
               "Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
               "Password = yourpass; USER ID = yourid"
        Dim cnCache As CacheConnection = New CacheConnection(cacheConnectStr)
        cnCache.Open()

        'Cache'内のコマンドを呼び出す方法（ここではByName関数を呼び出している。）
        Dim cmd1 As CacheCommand
        cmd1 = User.Main.TestClass.ByName(cnCache)
        Dim Name_param1 As CacheParameter = New CacheParameter("name", CacheDbType.NVarChar) '読みだしたいフィールドの指定。パラメータにしてよい
        Name_param1.Value = "Sakurai" '該当氏名を検索
        cmd1.Parameters.Add(Name_param1) '検索条件をパラメータに追加 "name = "Sakurai""
        Dim reader1 As CacheDataReader = cmd1.ExecuteReader() 'BasicPatientInformationの中でptidは一意

        '読み出し用。OpenIdで既存のレコードと結び付けられるので、Newは不要
        Dim d1 As User.Main.TestClass

        'データがある分だけ読み出す。ここでは2個
        Dim id As String
        While reader1.Read()
            id = reader1(reader1.GetOrdinal("ID")).ToString() 'データが格納された先頭からID番号を拾う
            d1 = User.Main.TestClass.OpenId(cnCache, id) 'ID番号でデータベースにアクセスする
            MsgBox(d1.Id + " " + d1.name + " " + CStr(d1.age))
        End While

    End Sub
```

実行結果は次の通り。ここではMsgBoxで表示するだけですが、この読み取ったデータから、登録されたID番号を知ることができ、このIDでOpenIdをする、という方法で、個々のレコードにアクセスします。

![20180829-7.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/83865e1d-cc27-3dea-6f09-633c4234f529.png)

このプログラムでは、Sakuraiさんだけを入力したので、検索条件に合うので2レコードとも出力されましたが、違う名前が入っていると読み出されなくなります。（抽出機能）すべてのレコードを読み出したいときは、

```

Name_param1.Value = ""
```

と記述すれば読み出せます。