- DocumentDB SQL 教程
- DocumentDB SQL - 首页
- DocumentDB SQL - 概述
- DocumentDB SQL - SELECT 语句
- DocumentDB SQL - FROM 语句
- DocumentDB SQL - WHERE 语句
- DocumentDB SQL - 运算符
- DocumentDB - BETWEEN 关键字
- DocumentDB SQL - IN 关键字
- DocumentDB SQL - VALUE 关键字
- DocumentDB SQL - ORDER BY 语句
- DocumentDB SQL - 迭代
- DocumentDB SQL - JOIN 操作
- DocumentDB SQL - 别名
- DocumentDB SQL - 数组创建
- DocumentDB - 标量表达式
- DocumentDB SQL - 参数化查询
- DocumentDB SQL - 内置函数
- LINQ to SQL 转换
- JavaScript 集成
- 用户自定义函数
- 复合 SQL 查询
- DocumentDB SQL 有用资源
- DocumentDB SQL - 快速指南
- DocumentDB SQL - 有用资源
- DocumentDB SQL - 讨论
DocumentDB 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
让我们再看一个示例。我们可以编写一个查询,该查询将姓氏和地址州作为参数,然后根据用户输入的姓氏和地址州的不同值执行该查询。
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"}, ] }
广告