ヘッダー
C# サンプル集
 

テーブルAPI でエンティティを1つ挿入する

2021/5/23

→ Visual Basic のサンプルに切り替える

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

Azure Cosmos DB Table API の概要 | Microsoft Docs

 

 

エンティティを挿入する

この例では、エンティティを挿入します。同じキーのエンティティが既に存在する場合例外が発生します。

前提

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

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

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

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

//▼追加するエンティティを生成
//この例ではエンティティは PersonEntity クラスとしてあらかじめ定義されています。
PersonEntity entity = new PersonEntity()
{
    firstName = "家康",
    lastName = "徳川",
    birthDay = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1843,1,31),TimeZoneInfo.Local),
    note = "江戸幕府の初代将軍"
};

//▼追加操作を実行
TableOperation insertOperation = TableOperation.Insert(entity);
TableResult result = table.Execute(insertOperation);
//非同期版もあります。
//TableResult result = await table.ExecuteAsync(insertOperation);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 8.57
}

Debug.WriteLineが表示される場所

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

PersonEntity クラス

public class PersonEntity : TableEntity
{
    [Microsoft.Azure.Cosmos.Table.IgnoreProperty]
    public string lastName { get => PartitionKey; set => PartitionKey = value; }
    [Microsoft.Azure.Cosmos.Table.IgnoreProperty]
    public string firstName { get => RowKey; set => RowKey = value; }
    public DateTime? birthDay { get; set; }
    public string note { get; set; }
}

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

メモ:nullがあり得る構造体の型には ? を付けておきます。

 

 

エンティティが存在しなければ挿入し、存在すればマージで更新する

この例では、同じキーのエンティティが存在しなければ挿入、存在すればマージで更新します。マージとは、値が指定された項目は置き換え、(nullなどで)値が指定されていない項目は何も更新しない操作です。

前提

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

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

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

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

//▼追加するエンティティを生成
//この例ではエンティティは PersonEntity クラスとしてあらかじめ定義されています。
PersonEntity entity = new PersonEntity()
{
    firstName = "家康",
    lastName = "徳川",
    note = "幼名は竹千代"
};

//▼追加操作を実行
TableOperation insertOrMergeOperation = TableOperation.InsertOrMerge(entity);
TableResult result = table.Execute(insertOrMergeOperation);
//非同期版もあります。
//TableResult result = await table.ExecuteAsync(insertOrMergeOperation);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 10前後
}

Debug.WriteLineが表示される場所

メモ:エンティティを挿入する例から続けて実行すると、birthDay は そのままで Note は「幼名は竹千代」に更新されます。

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

 

 

エンティティが存在しなければ挿入し、存在すれば置換で更新する

この例では、同じキーのエンティティが存在しなければ挿入、存在すれば置換で更新します。置換とは、存在するエンティティをまるごと新しいエンティティに置き換える操作です。

前提

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

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

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

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

//▼追加するエンティティを生成
//この例ではエンティティは PersonEntity クラスとしてあらかじめ定義されています。
PersonEntity entity = new PersonEntity()
{
    firstName = "家康",
    lastName = "徳川",
    note = "関ヶ原の戦いで勝利"
};

//▼追加操作を実行
TableOperation insertOrReplaceOperation = TableOperation.InsertOrReplace(entity);
TableResult result = table.Execute(insertOrReplaceOperation);
//非同期版もあります。
//TableResult result = await table.ExecuteAsync(insertOrReplaceOperation);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 10前後
}

Debug.WriteLineが表示される場所

メモ:エンティティを挿入する例から続けて実行すると、birthDay は 項目自体がなくなり、Note は「関ヶ原の戦いで勝利」に更新されます。

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

 

 

エンティティ用のクラスを定義せずに、エンティティを挿入する

この例では、エンティティを挿入します。同じキーのエンティティが既に存在する場合例外が発生します。

前述の例と異なり、エンティティを表すクラスを別途定義する必要はありません。

前提

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

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

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

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

//▼追加するエンティティを生成
DynamicTableEntity entity = new DynamicTableEntity("織田", "信長");

entity.Properties.Add("birthPlace", EntityProperty.GeneratePropertyForString("尾張"));
entity.Properties.Add("isTenkabito", EntityProperty.GeneratePropertyForBool(true));
entity.Properties.Add("pictures", EntityProperty.GeneratePropertyForInt(23));

//▼追加操作を実行
TableOperation insertOperation = TableOperation.Insert(entity);
TableResult result = table.Execute(insertOperation);
//非同期版もあります。
//TableResult result = await table.ExecuteAsync(insertOperation);

//▼結果
//この操作で消費された要求ユニット(RU)の使用量を出力します。
if (result.RequestCharge.HasValue)
{
    System.Diagnostics.Debug.WriteLine("要求ユニット使用量: " + result.RequestCharge); // 9.52
}

Debug.WriteLineが表示される場所

実行すると次のようなエンティティが挿入されます。

PartitionKey RowKey Timestamp birthPlace isTenkabito pictures
織田 信長 Mon, 03 May 2021 06:13:09 GMT 尾張 true 23

 

 

参考

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

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