开发手册 欢迎您!
软件开发者资料库

DocumentDB SQL - 参数化

DocumentDB SQL参数化 - 从概述,选择子句,从子句,子句,操作符,关键字之间,关键字,值关键字,按顺序子句,迭代,连接,别名,数组创建,标量开始,从简单而简单的步骤学习DocumentDB SQL表达式,参数化SQL,内置函数,Linq to SQL转换,JavaScript集成,用户定义函数,复合SQL查询。

在关系数据库中,参数化查询是一种查询,其中占位符用于参数,参数值在执行时提供. DocumentDB还支持参数化查询,参数化查询中的参数可以用熟悉的@表示法表示.使用参数化查询的最重要原因是避免SQL注入攻击.它还可以提供强大的处理和用户输入的转义.

让我们看一下我们将使用.Net SDK的示例.以下是将删除集合的代码.

private async static Task DeleteCollection(DocumentClient client, string collectionId) {    Console.WriteLine();    Console.WriteLine(">>> Delete Collection {0} in {1} <<<",    collectionId, _database.Id);     var query = new SqlQuerySpec {       QueryText = "SELECT * FROM c WHERE c.id = @id",       Parameters = new SqlParameterCollection { new SqlParameter { Name =          "@id", Value = collectionId } }    };      DocumentCollection collection = client.CreateDocumentCollectionQuery(database.SelfLink,       query).AsEnumerable().First();     await client.DeleteDocumentCollectionAsync(collection.SelfLink);     Console.WriteLine("Deleted collection {0} from database {1}",       collectionId, _database.Id); }

参数化查询的构造如下:

var query = new SqlQuerySpec {    QueryText = "SELECT * FROM c WHERE c.id = @id",   Parameters = new SqlParameterCollection { new SqlParameter { Name =       "@id", Value = collectionId } } };

我们没有对collectionId进行硬编码,因此可以使用此方法删除任何集合.我们可以使用'@'符号来为参数名称添加前缀,类似于SQL Server.

在上面的示例中,我们通过Id查询特定集合,其中Id参数在此定义SqlParameterCollection分配给此SqlQuerySpec的参数属性.然后,SDK完成构建DocumentDB的最终查询字符串的工作,其中嵌入了collectionId.我们运行查询,然后使用其SelfLink删除集合.

以下是CreateDocumentClient任务实现.

private static async Task CreateDocumentClient() {    // Create a new instance of the DocumentClient    using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {       database = client.CreateDatabaseQuery("SELECT * FROM          c WHERE c.id = 'earthquake'").AsEnumerable().First();       collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,          "SELECT * FROM c WHERE c.id = 'myfirstdb'").AsEnumerable().First();      await DeleteCollection(client, "MyCollection1");       await DeleteCollection(client, "MyCollection2");    } }

执行代码时,会产生以下输出.

**** Delete Collection MyCollection1 in mydb **** Deleted collection MyCollection1 from database myfirstdb  **** Delete Collection MyCollection2 in mydb **** Deleted collection MyCollection2 from database myfirstdb

让我们看看另一个例子.我们可以编写一个以姓氏和地址状态为参数的查询,然后根据用户输入为lastname和location.state的各种值执行它.

SELECT *  FROM Families f WHERE f.lastName = @lastName AND f.location.state = @addressState

然后可以将此请求作为参数化JSON查询发送到DocumentDB,如以下代码所示.

{          "query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND       f.location.state = @addressState",    "parameters": [                 {"name": "@lastName", "value": "Wakefield"},                {"name": "@addressState", "value": "NY"},               ]  }
a/js-sdk-pro.min.js">