Azureテーブルストレージのサンプルプログラム

Azure テーブルストレージ のサンプルプログラムです。

以下のライブラリを使用します。

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;


以下のサンプルプログラムを作成しました。

  • 接続文字列から作成したアカウントのテーブルを取得する。
  • テーブルが存在していなければ作成する。
  • 指定のテーブルに指定のエンティティを挿入する。
  • 指定のテーブル内の指定の条件を満たすエンティティを検索する。
  • 指定のテーブル内のすべてのエンティティを削除する。


接続文字列からクラウドストレージアカウントを作成し、そのアカウントのテーブルを取得するメソッド。ローカルでテストする場合は、接続文字列として "UseDevelopmentStorage=true" を指定し、ストレージのエミュレータ Azurite を使用します。

/// <summary>
/// 指定の接続文字列から作成したクラウドストレージアカウントの
/// 指定のテーブルへの参照を取得する。
/// </summary>
/// <param name="connectionString">
/// クラウドストレージアカウントの作成に使用する接続文字列。
/// </param>
/// <param name="tableName">参照を取得するテーブル名。</param>
/// <returns>取得したテーブルへの参照を返す。</returns>
private static CloudTable GetTableReference(
    string connectionString, string tableName)
{
    CloudStorageAccount storageAccount = 
        CloudStorageAccount.Parse(connectionString);
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
    CloudTable table = tableClient.GetTableReference(tableName);
    return table;
}


テーブルが存在していなければ作成するメソッド。

/// <summary>
/// 指定のテーブル参照にテーブルが存在していなければ非同期で作成する。
/// </summary>
/// <param name="table">テーブルを作成するテーブル参照。</param>
private static async Task CreateTableIfNotExistsAsync(CloudTable table)
{
    await table.CreateIfNotExistsAsync();
}


指定のテーブルに指定のエンティティを挿入するメソッド。

/// <summary>
/// 指定のテーブルに指定のエンティティを非同期で挿入する。
/// </summary>
/// <param name="table">指定のエンティティを挿入するテーブル。</param>
/// <param name="entity">指定のテーブルに挿入するエンティティ。</param>
private static async Task InsertEntityAsync(
    CloudTable table, ITableEntity entity)
{
    TableOperation insertOp = TableOperation.Insert(entity);
    await table.ExecuteAsync(insertOp);
}


指定のテーブル内の指定の条件を満たすエンティティを検索するメソッド。

/// <summary>
/// 指定のテーブル内の指定の条件を満たすエンティティを非同期で検索する。
/// </summary>
/// <typeparam name="T">
/// テーブル内のエンティティの型。<see cref="ITableEntity"/>を実装し、
/// publicで引数のないコンストラクタが必要。
/// </typeparam>
/// <param name="table">検索するエンティティを格納するテーブル。</param>
/// <param name="query">エンティティを検索する条件。</param>
/// <returns>テーブル内の条件を満たすエンティティのリストを返す。</returns>
private static async Task<List<T>> QueryEntitiesAsync<T>(
    CloudTable table, TableQuery<T> query)
    where T: ITableEntity, new()
{
    List<T> entities = new();
    TableContinuationToken? continuationToken = null;
    do
    {
        TableQuerySegment<T> querySegment = await 
            table.ExecuteQuerySegmentedAsync<T>(query, continuationToken);
        entities.AddRange(querySegment.Results);
        continuationToken = querySegment.ContinuationToken;
    } while (continuationToken != null);

    return entities;
}


条件はこんなふうに作成する。次の例は、エンティティ内のプロパティ "RowKey" の
整数としての値が 1,000 未満の場合。

TableQuery<TableEntity> query = new TableQuery<TableEntity>()
    .Where(TableQuery.GenerateFilterConditionForInt(
        "RowKey", QueryComparisons.LessThan, 1000));


指定のテーブル内のすべてのエンティティをで削除するメソッド。

/// <summary>
/// 指定のテーブル内のすべてのエンティティを非同期で削除する。
/// </summary>
/// <typeparam name="T">
/// テーブル内のエンティティの型。<see cref="ITableEntity"/>を実装し、
/// publicで引数のないコンストラクタが必要。
/// </typeparam>
/// <param name="table">削除するエンティティを格納するテーブル。</param>
private static async Task DeleteAllEntitiesAsync<T>(CloudTable table)
    where T: ITableEntity, new()
{
    TableQuery<T> query = new();
    TableContinuationToken? continuationToken = null;
    do
    {
        TableQuerySegment<T> querySegment = await
            table.ExecuteQuerySegmentedAsync<T>(query, continuationToken);

        foreach (ITableEntity entity in querySegment.Results)
        {
            TableOperation deleteOp = TableOperation.Delete(entity);
            await table.ExecuteAsync(deleteOp);
        }

        continuationToken = querySegment.ContinuationToken;
    } while (continuationToken != null);
}