Menu
Amazon DynamoDB
Developer Guide (API Version 2012-08-10)

Creating Example Tables and Uploading Data Using the AWS SDK for .NET

The following C# code example creates tables and uploads data to the tables. The resulting table structure and data is shown in Creating Tables and Loading Sample Data. For step-by-step instructions to run this code in Visual Studio, see .NET Code Samples.

using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2.Model;
using Amazon.Runtime;
using Amazon.SecurityToken;

namespace com.amazonaws.codesamples
{
    class CreateTablesLoadData
    {
    private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

    static void Main(string[] args)
    {
        try
        {
            //DeleteAllTables(client);
            DeleteTable("ProductCatalog");
            DeleteTable("Forum");
            DeleteTable("Thread");
            DeleteTable("Reply");

            // Create tables (using the AWS SDK for .NET low-level API).
            CreateTableProductCatalog();
            CreateTableForum();
            CreateTableThread(); // ForumTitle, Subject */
            CreateTableReply();

            // Load data (using the .NET SDK document API)
            LoadSampleProducts();
            LoadSampleForums();
            LoadSampleThreads();
            LoadSampleReplies();
            Console.WriteLine("Sample complete!");
            Console.WriteLine("Press ENTER to continue");
            Console.ReadLine();
        }
        catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
        catch (Exception e) { Console.WriteLine(e.Message); }
    }

    private static void DeleteTable(string tableName)
    {
        try
        {
            var deleteTableResponse = client.DeleteTable(new DeleteTableRequest() {
                                         TableName = tableName
                                     });
            WaitTillTableDeleted(client, tableName, deleteTableResponse);
        }
        catch (ResourceNotFoundException)
        {
            // There is no such table.
        }
    }

    private static void CreateTableProductCatalog()
    {
        string tableName = "ProductCatalog";

        var response = client.CreateTable(new CreateTableRequest
                          {
                              TableName = tableName,
                              AttributeDefinitions = new List<AttributeDefinition>()
                              {
                                  new AttributeDefinition
                                  {
                                      AttributeName = "Id",
                                      AttributeType = "N"
                                  }
                              },
                              KeySchema = new List<KeySchemaElement>()
                              {
                                  new KeySchemaElement
                                  {
                                      AttributeName = "Id",
                                      KeyType = "HASH"
                                  }
                              },
                              ProvisionedThroughput = new ProvisionedThroughput
                              {
                                  ReadCapacityUnits = 10,
                                  WriteCapacityUnits = 5
                              }
                          });

        WaitTillTableCreated(client, tableName, response);
    }

    private static void CreateTableForum()
    {
        string tableName = "Forum";

        var response = client.CreateTable(new CreateTableRequest
                          {
                              TableName = tableName,
                              AttributeDefinitions = new List<AttributeDefinition>()
                              {
                                  new AttributeDefinition
                                  {
                                      AttributeName = "Name",
                                      AttributeType = "S"
                                  }
                              },
                              KeySchema = new List<KeySchemaElement>()
                              {
                                  new KeySchemaElement
                                  {
                                      AttributeName = "Name", // forum Title
                                      KeyType = "HASH"
                                  }
                              },
                              ProvisionedThroughput = new ProvisionedThroughput
                              {
                                  ReadCapacityUnits = 10,
                                  WriteCapacityUnits = 5
                              }
                          });

        WaitTillTableCreated(client, tableName, response);
    }

    private static void CreateTableThread()
    {
        string tableName = "Thread";

        var response = client.CreateTable(new CreateTableRequest
                          {
                              TableName = tableName,
                              AttributeDefinitions = new List<AttributeDefinition>()
                              {
                                  new AttributeDefinition
                                  {
                                      AttributeName = "ForumName", // Hash attribute
                                      AttributeType = "S"
                                  },
                                  new AttributeDefinition
                                  {
                                      AttributeName = "Subject",
                                      AttributeType = "S"
                                  }
                              },
                              KeySchema = new List<KeySchemaElement>()
                              {
                                  new KeySchemaElement
                                  {
                                      AttributeName = "ForumName", // Hash attribute
                                      KeyType = "HASH"
                                  },
                                  new KeySchemaElement
                                  {
                                      AttributeName = "Subject", // Range attribute
                                      KeyType = "RANGE"
                                  }
                              },
                              ProvisionedThroughput = new ProvisionedThroughput
                              {
                                  ReadCapacityUnits = 10,
                                  WriteCapacityUnits = 5
                              }
                          });

        WaitTillTableCreated(client, tableName, response);
    }

    private static void CreateTableReply()
    {
        string tableName = "Reply";
        var response = client.CreateTable(new CreateTableRequest
                          {
                              TableName = tableName,
                              AttributeDefinitions = new List<AttributeDefinition>()
                              {
                                  new AttributeDefinition
                                  {
                                      AttributeName = "Id",
                                      AttributeType = "S"
                                  },
                                  new AttributeDefinition
                                  {
                                      AttributeName = "ReplyDateTime",
                                      AttributeType = "S"
                                  },
                                  new AttributeDefinition
                                  {
                                      AttributeName = "PostedBy",
                                      AttributeType = "S"
                                  }

                              },
                              KeySchema = new List<KeySchemaElement>()
                              {
                                  new KeySchemaElement()
                                  {
                                      AttributeName = "Id",
                                      KeyType = "HASH"
                                  },
                                  new KeySchemaElement()
                                  {
                                      AttributeName = "ReplyDateTime",
                                      KeyType = "RANGE"
                                  }
                              },
                              LocalSecondaryIndexes = new List<LocalSecondaryIndex>()
                              {
                                  new LocalSecondaryIndex()
                                  {
                                      IndexName = "PostedBy_index",


                                      KeySchema = new List<KeySchemaElement>() {
                                          new KeySchemaElement() {
                                              AttributeName = "Id", KeyType = "HASH"
                                          },
                                          new KeySchemaElement() {
                                              AttributeName = "PostedBy", KeyType = "RANGE"
                                          }
                                      },
                                      Projection = new Projection() {
                                          ProjectionType = ProjectionType.KEYS_ONLY
                                      }
                                  }
                              },
                              ProvisionedThroughput = new ProvisionedThroughput
                              {
                                  ReadCapacityUnits = 10,
                                  WriteCapacityUnits = 5
                              }
                          });

        WaitTillTableCreated(client, tableName, response);
    }

    private static void WaitTillTableCreated(AmazonDynamoDBClient client, string tableName,
                         CreateTableResponse response)
    {
        var tableDescription = response.TableDescription;

        string status = tableDescription.TableStatus;

        Console.WriteLine(tableName + " - " + status);

        // Let us wait until table is created. Call DescribeTable.
        while (status != "ACTIVE")
        {
            System.Threading.Thread.Sleep(5000); // Wait 5 seconds.
            try
            {
                var res = client.DescribeTable(new DescribeTableRequest
                                   {
                                       TableName = tableName
                                   });
                Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName,
                          res.Table.TableStatus);
                status = res.Table.TableStatus;
            }
            // Try-catch to handle potential eventual-consistency issue.
            catch (ResourceNotFoundException)
            { }
        }
    }

    private static void WaitTillTableDeleted(AmazonDynamoDBClient client, string tableName,
                         DeleteTableResponse response)
    {
        var tableDescription = response.TableDescription;

        string status = tableDescription.TableStatus;

        Console.WriteLine(tableName + " - " + status);

        // Let us wait until table is created. Call DescribeTable
        try
        {
            while (status == "DELETING")
            {
                System.Threading.Thread.Sleep(5000); // wait 5 seconds

                var res = client.DescribeTable(new DescribeTableRequest
                                   {
                                       TableName = tableName
                                   });
                Console.WriteLine("Table name: {0}, status: {1}", res.Table.TableName,
                          res.Table.TableStatus);
                status = res.Table.TableStatus;
            }

        }
        catch (ResourceNotFoundException)
        {
            // Table deleted.
        }
    }

    private static void LoadSampleProducts()
    {
        Table productCatalogTable = Table.LoadTable(client, "ProductCatalog");
        // ********** Add Books *********************
        var book1 = new Document();
        book1["Id"] = 101;
        book1["Title"] = "Book 101 Title";
        book1["ISBN"] = "111-1111111111";
        book1["Authors"] = new List<string> { "Author 1" };
        book1["Price"] = -2; // *** Intentional value. Later used to illustrate scan.
        book1["Dimensions"] = "8.5 x 11.0 x 0.5";
        book1["PageCount"] = 500;
        book1["InPublication"] = true;
        book1["ProductCategory"] = "Book";
        productCatalogTable.PutItem(book1);

        var book2 = new Document();

        book2["Id"] = 102;
        book2["Title"] = "Book 102 Title";
        book2["ISBN"] = "222-2222222222";
        book2["Authors"] = new List<string> { "Author 1", "Author 2" };;
        book2["Price"] = 20;
        book2["Dimensions"] = "8.5 x 11.0 x 0.8";
        book2["PageCount"] = 600;
        book2["InPublication"] = true;
        book2["ProductCategory"] = "Book";
        productCatalogTable.PutItem(book2);

        var book3 = new Document();
        book3["Id"] = 103;
        book3["Title"] = "Book 103 Title";
        book3["ISBN"] = "333-3333333333";
        book3["Authors"] = new List<string> { "Author 1", "Author2", "Author 3" };;
        book3["Price"] = 2000;
        book3["Dimensions"] = "8.5 x 11.0 x 1.5";
        book3["PageCount"] = 700;
        book3["InPublication"] = false;
        book3["ProductCategory"] = "Book";
        productCatalogTable.PutItem(book3);

        // ************ Add bikes. *******************
        var bicycle1 = new Document();
        bicycle1["Id"] = 201;
        bicycle1["Title"] = "18-Bike 201"; // size, followed by some title.
        bicycle1["Description"] = "201 description";
        bicycle1["BicycleType"] = "Road";
        bicycle1["Brand"] = "Brand-Company A"; // Trek, Specialized.
        bicycle1["Price"] = 100;
        bicycle1["Color"] = new List<string> { "Red", "Black" };
        bicycle1["ProductCategory"] = "Bike";
        productCatalogTable.PutItem(bicycle1);

        var bicycle2 = new Document();
        bicycle2["Id"] = 202;
        bicycle2["Title"] = "21-Bike 202Brand-Company A";
        bicycle2["Description"] = "202 description";
        bicycle2["BicycleType"] = "Road";
        bicycle2["Brand"] = "";
        bicycle2["Price"] = 200;
        bicycle2["Color"] = new List<string> { "Green", "Black" };
        bicycle2["ProductCategory"] = "Bicycle";
        productCatalogTable.PutItem(bicycle2);

        var bicycle3 = new Document();
        bicycle3["Id"] = 203;
        bicycle3["Title"] = "19-Bike 203";
        bicycle3["Description"] = "203 description";
        bicycle3["BicycleType"] = "Road";
        bicycle3["Brand"] = "Brand-Company B";
        bicycle3["Price"] = 300;
        bicycle3["Color"] = new List<string> { "Red", "Green", "Black" };
        bicycle3["ProductCategory"] = "Bike";
        productCatalogTable.PutItem(bicycle3);

        var bicycle4 = new Document();
        bicycle4["Id"] = 204;
        bicycle4["Title"] = "18-Bike 204";
        bicycle4["Description"] = "204 description";
        bicycle4["BicycleType"] = "Mountain";
        bicycle4["Brand"] = "Brand-Company B";
        bicycle4["Price"] = 400;
        bicycle4["Color"] = new List<string> { "Red" };
        bicycle4["ProductCategory"] = "Bike";
        productCatalogTable.PutItem(bicycle4);

        var bicycle5 = new Document();
        bicycle5["Id"] = 205;
        bicycle5["Title"] = "20-Title 205";
        bicycle4["Description"] = "205 description";
        bicycle5["BicycleType"] = "Hybrid";
        bicycle5["Brand"] = "Brand-Company C";
        bicycle5["Price"] = 500;
        bicycle5["Color"] = new List<string> { "Red", "Black" };
        bicycle5["ProductCategory"] = "Bike";
        productCatalogTable.PutItem(bicycle5);
    }

    private static void LoadSampleForums()
    {
        Table forumTable = Table.LoadTable(client, "Forum");

        var forum1 = new Document();
        forum1["Name"] = "Amazon DynamoDB"; // PK
        forum1["Category"] = "Amazon Web Services";
        forum1["Threads"] = 2;
        forum1["Messages"] = 4;
        forum1["Views"] = 1000;

        forumTable.PutItem(forum1);

        var forum2 = new Document();
        forum2["Name"] = "Amazon S3"; // PK
        forum2["Category"] = "Amazon Web Services";
        forum2["Threads"] = 1;

        forumTable.PutItem(forum2);
    }

    private static void LoadSampleThreads()
    {
        Table threadTable = Table.LoadTable(client, "Thread");

        // Thread 1.
        var thread1 = new Document();
        thread1["ForumName"] = "Amazon DynamoDB"; // Hash attribute.
        thread1["Subject"] = "DynamoDB Thread 1"; // Range attribute.
        thread1["Message"] = "DynamoDB thread 1 message text";
        thread1["LastPostedBy"] = "User A";
        thread1["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0));
        thread1["Views"] = 0;
        thread1["Replies"] = 0;
        thread1["Answered"] = false;
        thread1["Tags"] = new List<string> { "index", "primarykey", "table" };

        threadTable.PutItem(thread1);

        // Thread 2.
        var thread2 = new Document();
        thread2["ForumName"] = "Amazon DynamoDB"; // Hash attribute.
        thread2["Subject"] = "DynamoDB Thread 2"; // Range attribute.
        thread2["Message"] = "DynamoDB thread 2 message text";
        thread2["LastPostedBy"] = "User A";
        thread2["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0));
        thread2["Views"] = 0;
        thread2["Replies"] = 0;
        thread2["Answered"] = false;
        thread2["Tags"] = new List<string> { "index", "primarykey", "rangekey" };

        threadTable.PutItem(thread2);

        // Thread 3.
        var thread3 = new Document();
        thread3["ForumName"] = "Amazon S3"; // Hash attribute.
        thread3["Subject"] = "S3 Thread 1"; // Range attribute.
        thread3["Message"] = "S3 thread 3 message text";
        thread3["LastPostedBy"] = "User A";
        thread3["LastPostedDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0));
        thread3["Views"] = 0;
        thread3["Replies"] = 0;
        thread3["Answered"] = false;
        thread3["Tags"] = new List<string> { "largeobjects", "multipart upload" };
        threadTable.PutItem(thread3);
    }

    private static void LoadSampleReplies()
    {
        Table replyTable = Table.LoadTable(client, "Reply");

        // Reply 1 - thread 1.
        var thread1Reply1 = new Document();
        thread1Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
        thread1Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(21, 0, 0, 0)); // Range attribute.
        thread1Reply1["Message"] = "DynamoDB Thread 1 Reply 1 text";
        thread1Reply1["PostedBy"] = "User A";

        replyTable.PutItem(thread1Reply1);

        // Reply 2 - thread 1.
        var thread1reply2 = new Document();
        thread1reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
        thread1reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Range attribute.
        thread1reply2["Message"] = "DynamoDB Thread 1 Reply 2 text";
        thread1reply2["PostedBy"] = "User B";

        replyTable.PutItem(thread1reply2);

        // Reply 3 - thread 1.
        var thread1Reply3 = new Document();
        thread1Reply3["Id"] = "Amazon DynamoDB#DynamoDB Thread 1"; // Hash attribute.
        thread1Reply3["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0)); // Range attribute.
        thread1Reply3["Message"] = "DynamoDB Thread 1 Reply 3 text";
        thread1Reply3["PostedBy"] = "User B";

        replyTable.PutItem(thread1Reply3);

        // Reply 1 - thread 2.
        var thread2Reply1 = new Document();
        thread2Reply1["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute.
        thread2Reply1["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(7, 0, 0, 0)); // Range attribute.
        thread2Reply1["Message"] = "DynamoDB Thread 2 Reply 1 text";
        thread2Reply1["PostedBy"] = "User A";


        replyTable.PutItem(thread2Reply1);

        // Reply 2 - thread 2.
        var thread2Reply2 = new Document();
        thread2Reply2["Id"] = "Amazon DynamoDB#DynamoDB Thread 2"; // Hash attribute.
        thread2Reply2["ReplyDateTime"] = DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0)); // Range attribute.
        thread2Reply2["Message"] = "DynamoDB Thread 2 Reply 2 text";
        thread2Reply2["PostedBy"] = "User A";

        replyTable.PutItem(thread2Reply2);
    }
    }
}