📅  最后修改于: 2020-11-28 13:38:05             🧑  作者: Mango
在关系数据库中,参数化查询是一种查询,其中占位符用于参数,并且在执行时提供参数值。 DocumentDB还支持参数化查询,并且可以使用熟悉的@表示法来表示参数化查询中的参数。使用参数化查询的最重要原因是避免SQL注入攻击。它还可以提供强大的处理和用户输入转义。
让我们看一个将使用.Net SDK的示例。以下是将删除集合的代码。
private async static Task DeleteCollection(DocumentClient client, string collectionId) {
Console.WriteLine();
Console.WriteLine(">>> Delete Collection {0} in {1} <<
参数化查询的构造如下。
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查询特定的集合,其中在此SqlParameterCollection中定义了ID参数的Id参数已分配给该SqlQuerySpec的参数属性。然后,SDK会为其中嵌入了collectionId的DocumentDB构建最终查询字符串。我们运行查询,然后使用其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
让我们看另一个例子。我们可以编写一个以姓氏和地址状态为参数的查询,然后根据用户输入对姓氏和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"},
]
}