- 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"},
]
}
廣告