using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aliyun.OTS; using Aliyun.OTS.DataModel; using Aliyun.OTS.Request; using Aliyun.OTS.Response; using Aliyun.OTS.DataModel.ConditionalUpdate; using Aliyun.OTS.Samples; namespace Sample1 { class Program { private static string TableName = "SampleTable"; static void Main(string[] args) { #region 打开连接 // 使用OTSClientConfig创建一个OtsClient对象 var otsClient = Config.GetClient(); #endregion #region 创建表 ////创建主键列的schema,包括PK的个数,名称和类型 ////第一个PK列为整数,名称是pk0,这个同时也是分片列 ////第二个PK列为字符串,名称是pk1 //var primaryKeySchema = new PrimaryKeySchema(); //primaryKeySchema.Add("pk0", ColumnValueType.Integer); //primaryKeySchema.Add("pk1", ColumnValueType.String); ////通过表名和主键列的schema创建一个tableMeta //var tableMeta = new TableMeta("SampleTable", primaryKeySchema); //// 设定预留读吞吐量为0,预留写吞吐量为0 //var reservedThroughput = new CapacityUnit(0, 0); //try //{ // // 构造CreateTableRequest对象 // var request = new CreateTableRequest(tableMeta, reservedThroughput); // // 调用client的CreateTable接口,如果没有抛出异常,则说明成功,否则失败 // otsClient.CreateTable(request); // Console.WriteLine("Create table succeeded."); //} //// 处理异常 //catch (Exception ex) //{ // Console.WriteLine("Create table failed, exception:{0}", ex.Message); //} #endregion #region 列出所有表 //var request = new ListTableRequest(); //try //{ // var response = otsClient.ListTable(request); // foreach (var tableName in response.TableNames) // { // Console.WriteLine("Table name:{0}", tableName); // } // Console.WriteLine("List table succeeded."); //} //catch (Exception ex) //{ // Console.WriteLine("List table failed, exception:{0}", ex.Message); //} #endregion #region 获取表的描述信息 //try //{ // var request = new DescribeTableRequest("SampleTable"); // var response = otsClient.DescribeTable(request); // // 打印表的描述信息 // Console.WriteLine("Describe table succeeded."); // Console.WriteLine("LastIncreaseTime: {0}", response.ReservedThroughputDetails.LastIncreaseTime); // Console.WriteLine("LastDecreaseTime: {0}", response.ReservedThroughputDetails.LastDecreaseTime); // Console.WriteLine("NumberOfDecreaseToday: {0}", response.ReservedThroughputDetails.LastIncreaseTime); // Console.WriteLine("ReadCapacity: {0}", response.ReservedThroughputDetails.CapacityUnit.Read); // Console.WriteLine("WriteCapacity: {0}", response.ReservedThroughputDetails.CapacityUnit.Write); //} //catch (Exception ex) //{ // //如果抛出异常,则说明执行失败,打印错误信息 // Console.WriteLine("Describe table failed, exception:{0}", ex.Message); //} #endregion #region 删除表 //var request = new DeleteTableRequest("SampleTable"); //try //{ // otsClient.DeleteTable(request); // Console.Writeline("Delete table succeeded."); //} //catch (Exception ex) //{ // Console.WriteLine("Delete table failed, exception:{0}", ex.Message); //} #endregion /*表格存储的 SDK 提供了 PutRow、GetRow、UpdateRow 和 DeleteRow 等单行操作的接口。*/ #region 插入数据 ///* // RowExistenceExpectation.IGNORE 表示不管此行是否已经存在,都会插入新数据,如果之前有会被覆盖。 // RowExistenceExpectation.EXPECT_EXIST 表示只有此行存在时,才会插入新数据,此时,原有数据也会被覆盖。 // RowExistenceExpectation.EXPECT_NOT_EXIST 表示只有此行不存在时,才会插入数据,否则不执行。 // */ //// 定义行的主键,必须与创建表时的TableMeta中定义的一致 //var primaryKey = new PrimaryKey(); //primaryKey.Add("pk0", new ColumnValue(0)); //primaryKey.Add("pk1", new ColumnValue("abc")); //// 定义要写入改行的属性列 //var attribute = new AttributeColumns(); //attribute.Add("col0", new ColumnValue(0)); //attribute.Add("col1", new ColumnValue("a")); //attribute.Add("col2", new ColumnValue(true)); //try //{ // // 构造插入数据的请求对象,RowExistenceExpectation.IGNORE表示不管此行是否存在都执行 // var request = new PutRowRequest("SampleTable", new Condition(RowExistenceExpectation.IGNORE), // primaryKey, attribute); // // 调用PutRow接口插入数据 // otsClient.PutRow(request); // // 如果没有抛出异常,则说明执行成功 // Console.WriteLine("Put row succeeded."); //} //catch (Exception ex) //{ // // 如果抛出异常,则说明执行失败,打印出错误信息 // Console.WriteLine("Put row failed, exception:{0}", ex.Message); //} #endregion #region 设置条件插入数据 /* 条件不仅支持单个条件,也支持多个条件组合。例如,col1 大于 5 且 pk2 小于’xyz’时插入数据。 属性列和主键列都支持条件。 当条件中的列在某行不存在时,可以通过 RelationCondition 中的 PassIfMissing 控制,默认是 true。 */ //// 定义行的主键,必须与创建表时的TableMeta中定义的一致 //var primaryKey = new PrimaryKey(); //primaryKey.Add("pk0", new ColumnValue(0)); //primaryKey.Add("pk1", new ColumnValue("abc")); //// 定义要写入改行的属性列 //AttributeColumns attribute = new AttributeColumns(); //attribute.Add("col0", new ColumnValue(0)); //attribute.Add("col1", new ColumnValue("a")); //attribute.Add("col2", new ColumnValue(true)); //var request = new PutRowRequest("SampleTable", new Condition(RowExistenceExpectation.EXPECT_EXIST), // primaryKey, attribute); //// 当col0列的值大于24的时候,允许再次put row,覆盖掉原值 //try //{ // request.Condition.ColumnCondition = new RelationalCondition("col0", // RelationalCondition.CompareOperator.GREATER_THAN, // new ColumnValue(24)); // otsClient.PutRow(request); // Console.WriteLine("Put row succeeded."); //} //catch (Exception ex) //{ // Console.WriteLine("Put row failed. error:{0}", ex.Message); //} #endregion #region 读取一行数据 //// 定义行的主键,必须与创建表时的TableMeta中定义的一致 //PrimaryKey primaryKey = new PrimaryKey(); //primaryKey.Add("pk0", new ColumnValue(0)); //primaryKey.Add("pk1", new ColumnValue("abc")); //try //{ // // 构造查询请求对象,这里未指定读哪列,默认读整行 // var request = new GetRowRequest("SampleTable", primaryKey); // // 调用GetRow接口查询数据 // var response = otsClient.GetRow(request); // // 输出此行的数据,这里省略,详见下面GitHub的链接 // // 如果没有抛出异常,则说明成功 // PrimaryKey primaryKeyRead = response.PrimaryKey; // AttributeColumns attributesRead = response.Attribute; // Console.WriteLine("Primary key read: "); // foreach (KeyValuePair<string, ColumnValue> entry in primaryKeyRead) // { // Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value)); // } // Console.WriteLine("Attributes read: "); // foreach (KeyValuePair<string, ColumnValue> entry in attributesRead) // { // Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value)); // } // Console.WriteLine("Get row succeed."); //} //catch (Exception ex) //{ // // 如果抛出异常,说明执行失败,打印出错误信息 // Console.WriteLine("Update table failed, exception:{0}", ex.Message); //} #endregion #region 更新一行数据 //// 定义行的主键,必须与创建表时的TableMeta中定义的一致 //PrimaryKey primaryKey = new PrimaryKey(); //primaryKey.Add("pk0", new ColumnValue(0)); //primaryKey.Add("pk1", new ColumnValue("abc")); //// 定义要写入改行的属性列 //UpdateOfAttribute attribute = new UpdateOfAttribute(); //attribute.AddAttributeColumnToPut("col0", new ColumnValue(0)); //attribute.AddAttributeColumnToPut("col1", new ColumnValue("b")); // 将原先的值'a'改为'b' //attribute.AddAttributeColumnToPut("col2", new ColumnValue(true)); //try //{ // // 构造更新行的请求对象,RowExistenceExpectation.IGNORE表示不管此行是否存在都执行 // var request = new UpdateRowRequest("SampleTable", new Condition(RowExistenceExpectation.IGNORE), // primaryKey, attribute); // // 调用UpdateRow接口执行 // otsClient.UpdateRow(request); // // 如果没有抛出异常,则说明执行成功 // Console.WriteLine("Update row succeeded."); //} //catch (Exception ex) //{ // // 如果抛出异常,说明执行失败,打印异常信息 // Console.WriteLine("Update row failed, exception:{0}", ex.Message); //} #endregion #region 删除一行数据 // 要删除的行的PK列分别为0和"abc" //var primaryKey = new PrimaryKey(); //primaryKey.Add("pk0", new ColumnValue(0)); //primaryKey.Add("pk1", new ColumnValue("abc")); //try //{ // // 构造请求,Condition.EXPECT_EXIST表示只有此行存在时才执行 // var condition = new Condition(RowExistenceExpectation.EXPECT_EXIST); // var deleteRowRequest = new DeleteRowRequest("SampleTable", condition, primaryKey); // // 调用DeleteRow接口执行删除 // otsClient.DeleteRow(deleteRowRequest); // // 如果没有抛出异常,则表示成功 // Console.WriteLine("Delete table succeeded."); //} //catch (Exception ex) //{ // // 如果抛出异常,说明删除失败,打印粗错误信息 // Console.WriteLine("Delete table failed, exception:{0}", ex.Message); //} #endregion #region 批量删除数据 //BatchWriteRow(); #endregion #region 根据条件获取多条数据 //GetRange(); #endregion Console.ReadKey(); } private static void PrepareTable() { // 创建表 OTSClient otsClient = Config.GetClient(); IList<string> tables = otsClient.ListTable(new ListTableRequest()).TableNames; if (tables.Contains(TableName)) { return; } PrimaryKeySchema primaryKeySchema = new PrimaryKeySchema(); primaryKeySchema.Add("pk0", ColumnValueType.Integer); primaryKeySchema.Add("pk1", ColumnValueType.String); TableMeta tableMeta = new TableMeta(TableName, primaryKeySchema); CapacityUnit reservedThroughput = new CapacityUnit(1, 1); CreateTableRequest request = new CreateTableRequest(tableMeta, reservedThroughput); otsClient.CreateTable(request); } private static void PrepareData() { OTSClient otsClient = Config.GetClient(); // 插入100条数据 for (int i = 0; i < 100; i++) { PrimaryKey primaryKey = new PrimaryKey(); primaryKey.Add("pk0", new ColumnValue(i)); primaryKey.Add("pk1", new ColumnValue("abc")); // 定义要写入改行的属性列 AttributeColumns attribute = new AttributeColumns(); attribute.Add("col0", new ColumnValue(0)); attribute.Add("col1", new ColumnValue("a")); attribute.Add("col2", new ColumnValue(i % 3 != 0)); PutRowRequest request = new PutRowRequest(TableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute); otsClient.PutRow(request); } } private static void BatchWriteRow() { Console.WriteLine("Start batch write row..."); PrepareTable(); PrepareData(); OTSClient otsClient = Config.GetClient(); // 一次批量导入100行数据 var request = new BatchWriteRowRequest(); var rowChanges = new RowChanges(); for (int i = 0; i < 100; i++) { PrimaryKey primaryKey = new PrimaryKey(); primaryKey.Add("pk0", new ColumnValue(i)); primaryKey.Add("pk1", new ColumnValue("abc")); // 定义要写入改行的属性列 UpdateOfAttribute attribute = new UpdateOfAttribute(); attribute.AddAttributeColumnToPut("col0", new ColumnValue(0)); attribute.AddAttributeColumnToPut("col1", new ColumnValue("a")); attribute.AddAttributeColumnToPut("col2", new ColumnValue(true)); rowChanges.AddUpdate(new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute); } request.Add(TableName, rowChanges); var response = otsClient.BatchWriteRow(request); var tableRows = response.TableRespones; var rows = tableRows[TableName]; int succeedRows = 0; int failedRows = 0; foreach (var row in rows.UpdateResponses) { // 注意:batch操作可能部分成功部分失败,需要为每行检查状态 if (row.IsOK) { succeedRows++; } else { Console.WriteLine("Read row failed: " + row.ErrorMessage); failedRows++; } } Console.WriteLine("SucceedRows: " + succeedRows); Console.WriteLine("FailedRows: " + failedRows); } public static void GetRange() { Console.WriteLine("Start get range..."); PrepareTable(); PrepareData(); OTSClient otsClient = Config.GetClient(); // 读取 (0, INF_MIN)到(100, INF_MAX)这个范围内的所有行 PrimaryKey inclusiveStartPrimaryKey = new PrimaryKey(); inclusiveStartPrimaryKey.Add("pk0", new ColumnValue(0)); inclusiveStartPrimaryKey.Add("pk1", ColumnValue.INF_MIN); PrimaryKey exclusiveEndPrimaryKey = new PrimaryKey(); exclusiveEndPrimaryKey.Add("pk0", new ColumnValue(100)); exclusiveEndPrimaryKey.Add("pk1", ColumnValue.INF_MAX); GetRangeRequest request = new GetRangeRequest(TableName, GetRangeDirection.Forward, inclusiveStartPrimaryKey, exclusiveEndPrimaryKey); GetRangeResponse response = otsClient.GetRange(request); IList<RowDataFromGetRange> rows = response.RowDataList; PrimaryKey nextStartPrimaryKey = response.NextPrimaryKey; while (nextStartPrimaryKey != null) { request = new GetRangeRequest(TableName, GetRangeDirection.Forward, nextStartPrimaryKey, exclusiveEndPrimaryKey); response = otsClient.GetRange(request); nextStartPrimaryKey = response.NextPrimaryKey; foreach (RowDataFromGetRange row in response.RowDataList) { rows.Add(row); } } foreach (RowDataFromGetRange row in rows) { Console.WriteLine("-----------------"); foreach (KeyValuePair<string, ColumnValue> entry in row.PrimaryKey) { Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value)); } foreach (KeyValuePair<string, ColumnValue> entry in row.Attribute) { Console.WriteLine(entry.Key + ":" + PrintColumnValue(entry.Value)); } Console.WriteLine("-----------------"); } Console.WriteLine("TotalRowsRead: " + rows.Count); } private static string PrintColumnValue(ColumnValue value) { switch (value.Type) { case ColumnValueType.String: return value.StringValue; case ColumnValueType.Integer: return value.IntegerValue.ToString(); case ColumnValueType.Boolean: return value.BooleanValue.ToString(); case ColumnValueType.Double: return value.DoubleValue.ToString(); case ColumnValueType.Binary: return value.BinaryValue.ToString(); } throw new Exception("Unknow type."); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aliyun.OTS; namespace Aliyun.OTS.Samples { internal class Config { public static string AccessKeyId = ""; public static string AccessKeySecret = ""; public static string Endpoint = ""; public static string InstanceName = ""; private static OTSClient OtsClient = null; public static OTSClient GetClient() { if (OtsClient != null) { return OtsClient; } OTSClientConfig config = new OTSClientConfig(Endpoint, AccessKeyId, AccessKeySecret, InstanceName); config.OTSDebugLogHandler = null; config.OTSErrorLogHandler = null; OtsClient = new OTSClient(config); return OtsClient; } } }