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"},            
   ]  
}
廣告
© . All rights reserved.