Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 > Azure > Cosmos DB
テーブルAPI でエンティティを1つ取得する
2021/5/23
この記事は Azure Cosmos DB テーブル API を対象にしています。
キーを指定してエンティティを取得する
この例では、PartitionKey が "家康"、 RowKey が"徳川"であるエンティティを取得します。
前提
- Azure Cosmos DB のアカウントがあり、テーブルAPIのデータベース上に TestTable というテーブルが存在する。
- NuGet で Microsoft.Azure.Cosmos.Table パッケージをインストールしている。 → NuGetの使用方法
- Imports Microsoft.Azure.Cosmos.Table がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
結果の出力例
要求ユニット使用量: 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 がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
結果の出力例
要求ユニット使用量: 2
PartitionKey = 徳川
RowKey = 家康
birthDay = 1843/01/31 0:00:00
note = 幼名は竹千代
この例で使用している PersonEntity は次の通りです。
PersonEntity クラス
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 がソースコードの冒頭付近に記載されている。
メモ:接続文字列の確認方法
'▼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
メモ:この例で使用している 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では XMLHttpRequestの機能でREST APIを呼び出すことで、同じことを実現できるかもしれません。