ヘッダー
Visual Basic サンプル集
VB2005対応 VB2008対応 VB2010対応 VB2012対応 VB2013対応 VB2015対応 VB2017対応 VB2019対応

テーブルAPI でエンティティを1つ取得する

2021/5/23

→ C# のサンプルに切り替える

この記事は Azure Cosmos DB テーブル API を対象にしています。

Azure Cosmos DB Table API の概要 | Microsoft Docs

 

 

キーを指定してエンティティを取得する

この例では、PartitionKey が "家康"、 RowKey が"徳川"であるエンティティを取得します。

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

VB2015対応 VB2017対応 VB2019対応

'▼Cosmos DBに接続
'接続文字列は環境に応じて指定してください。
Dim connectionString As String = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;"
Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(connectionString)

'▼テーブルへの参照を取得
Dim tableClient As CloudTableClient = storageAccount.CreateCloudTableClient()
Dim table As CloudTable = tableClient.GetTableReference("TestTable")

'▼取得操作を実行
Dim retreiveOperation As TableOperation = TableOperation.Retrieve("徳川","家康")
Dim result As TableResult = table.Execute(retreiveOperation)
'非同期版もあります。
'Dim result As TableResult = Await table.ExecuteAsync(retreiveOperation)


'▼結果
'この操作で消費された要求ユニット(RU)の使用量を出力します。
If result.RequestCharge.HasValue Then
    Debug.WriteLine("要求ユニット使用量: " & result.RequestCharge)
End If

'取得したエンティティ
If result.Result IsNot Nothing Then
    Dim entity As DynamicTableEntity = DirectCast(result.Result, DynamicTableEntity)

    Debug.WriteLine($"PartitionKey = {entity.PartitionKey}")
    Debug.WriteLine($"RowKey = {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"birthDay = {entity.Properties("birthDay")}")
    Debug.WriteLine($"note = {entity.Properties("note")}")
End If

Debug.WriteLineが表示される場所

結果の出力例

要求ユニット使用量: 2
PartitionKey = 徳川
RowKey = 家康
birthDay = 1843-01-31T00:00:00.0000000Z
note = 幼名は竹千代

 

 

キーを指定してエンティティを取得し、クラスにマッピングする

この例では、PartitionKey が "家康"、 RowKey が"徳川"であるエンティティを取得します。

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

VB2015対応 VB2017対応 VB2019対応

'▼Cosmos DBに接続
'接続文字列は環境に応じて指定してください。
Dim connectionString As String = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;"
Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(connectionString)

'▼テーブルへの参照を取得
Dim tableClient As CloudTableClient = storageAccount.CreateCloudTableClient()
Dim table As CloudTable = tableClient.GetTableReference("TestTable")

'▼取得操作を実行
Dim retreiveOperation As TableOperation = TableOperation.Retrieve(Of PersonEntity)("徳川","家康")
Dim result As TableResult = table.Execute(retreiveOperation)
'非同期版もあります。
'Dim result As TableResult = Await table.ExecuteAsync(retreiveOperation)


'▼結果
'この操作で消費された要求ユニット(RU)の使用量を出力します。
If result.RequestCharge.HasValue Then
    Debug.WriteLine("要求ユニット使用量: " & result.RequestCharge)
End If

'取得したエンティティ
If result.Result IsNot Nothing Then
    Dim entity As PersonEntity = DirectCast(result.Result, PersonEntity)

    Debug.WriteLine($"PartitionKey = {entity.PartitionKey}")
    Debug.WriteLine($"RowKey = {entity.RowKey}")
    'ここから下はエンティティに含まれるプロパティによって変更する必要があります。
    Debug.WriteLine($"birthDay = {entity.birthDay}")
    Debug.WriteLine($"note = {entity.note}")
End If

Debug.WriteLineが表示される場所

 

結果の出力例

要求ユニット使用量: 2
PartitionKey = 徳川
RowKey = 家康
birthDay = 1843/01/31 0:00:00
note = 幼名は竹千代

 

この例で使用している PersonEntity は次の通りです。

PersonEntity クラス

VB2015対応 VB2017対応 VB2019対応

Public Class PersonEntity
    Inherits TableEntity
    <Microsoft.Azure.Cosmos.Table.IgnoreProperty>
    Public Property lastName As String
        Get
            Return PartitionKey
        End Get
        Set(value As String)
            PartitionKey = value
        End Set
    End Property
    <Microsoft.Azure.Cosmos.Table.IgnoreProperty>
    Public Property firstName As String
        Get
            Return RowKey
        End Get
        Set(value As String)
            RowKey = value
        End Set
    End Property
    Public Property birthDay As Date?
    Public Property note As String
End Class

メモ:エンティティは TableEntity を継承するのが楽です。この例ではキー項目にIgnoreProperty属性をつけて PartitionKey と RowKey にそれぞれマッピングしています。その代わりにPartitionKeyプロパティ、RowKeyプロパティを直接使用する方法もあります。

 

 

キーを指定してエンティティをJSONとして取得する

この例では、PartitionKey が "家康"、 RowKey が"徳川"であるエンティティを取得します。

前提

  • Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
  • NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
  • Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。

メモ:接続文字列の確認方法

VB2015対応 VB2017対応 VB2019対応

'▼Cosmos DBに接続
'接続文字列は環境に応じて指定してください。
Dim connectionString As String = "DefaultEndpointsProtocol=https;AccountName=xxxxxx;AccountKey=U2V0IHlvdXIgYWNjb3VudCBrZXkgZnJvbSBhenVyZSBwb3J0YWw=;TableEndpoint=https://xxxxxx.table.cosmos.azure.com:443/;"
Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(connectionString)

'▼テーブルへの参照を取得
Dim tableClient As CloudTableClient = storageAccount.CreateCloudTableClient()
Dim table As CloudTable = tableClient.GetTableReference("TestTable")

'▼取得操作を実行
Dim retreiveOperation As TableOperation = TableOperation.Retrieve(Of PersonEntity)("徳川","家康")
Dim result As TableResult = table.Execute(retreiveOperation)
'非同期版もあります。
'Dim result As TableResult = Await table.ExecuteAsync(retreiveOperation)

'▼結果
'この操作で消費された要求ユニット(RU)の使用量を出力します。
If result.RequestCharge.HasValue Then
    Debug.WriteLine("要求ユニット使用量: " & result.RequestCharge)
End If

'取得したエンティティ
If result.Result IsNot Nothing Then
    Dim entity As PersonEntity = DirectCast(result.Result, PersonEntity)

    '結果をJSON化。
    '日本語の文字列などはエンコードされて確認しにくいので、この例ではエンコードしないようにオプション設定します。
    Dim options = New System.Text.Json.JsonSerializerOptions()
    options.Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping
    options.WriteIndented = True 'ついでに、改行とインデントで整形します。
    Dim json As String = System.Text.Json.JsonSerializer.Serialize(entity, options)

    '[別解]日本語の文字列などがエンコードされても良い場合は、次の1行だけでJSON化できます。
    'Dim json As String = System.Text.Json.JsonSerializer.Serialize(entity)

    '取得したエンティティを出力します。
    Debug.WriteLine("取得したエンティティ: " & Environment.NewLine & json)
End If

Debug.WriteLineが表示される場所

メモ:この例で使用している PersonEntity は 上述の例 と同じです。

 

結果の出力例

要求ユニット使用量: 2
取得したエンティティ: 
{
  "lastName": "徳川",
  "firstName": "家康",
  "birthDay": "1843-01-31T00:00:00Z",
  "note": "幼名は竹千代",
  "PartitionKey": "家康",
  "RowKey": "徳川",
  "Timestamp": "2021-05-03T04:16:14+00:00",
  "ETag": "W/\"datetime'2021-05-03T04%3A16%3A14.1785124Z'\""
}

メモ:プロパティに System.Text.Json.Serialization.JsonIgnore 属性を付けると、そのプロパティはJSON化の対象外にできます。

 

[別解] とコメントアウトしてある部分でJSON化した場合の結果は次のようになります。

要求ユニット使用量: 2
取得したエンティティ: 
{"lastName":"\u5FB3\u5DDD","firstName":"\u5BB6\u5EB7","birthDay":"1843-01-31T00:00:00Z","note":"\u5E7C\u540D\u306F\u7AF9\u5343\u4EE3","PartitionKey":"\u5FB3\u5DDD","RowKey":"\u5BB6\u5EB7","Timestamp":"2021-05-03T04:16:14+00:00","ETag":"W/\u0022datetime\u00272021-05-03T04%3A16%3A14.1785124Z\u0027\u0022"}

 

 

参考

.NET Standard SDK を使用した Azure Cosmos DB Table API | Microsoft Docs

クイック スタート:.NET での Table API の使用 - Azure Cosmos DB | Microsoft Docs

 


VB6対応 VB6では XMLHttpRequestの機能でREST APIを呼び出すことで、同じことを実現できるかもしれません。