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); } } }