DocumentDB SQL - Paramétré

Dans les bases de données relationnelles, une requête paramétrée est une requête dans laquelle des espaces réservés sont utilisés pour les paramètres et les valeurs de paramètre sont fournies au moment de l'exécution. DocumentDB prend également en charge les requêtes paramétrées, et les paramètres des requêtes paramétrées peuvent être exprimés avec la notation @ familière. La raison la plus importante d'utiliser des requêtes paramétrées est d'éviter les attaques par injection SQL. Il peut également fournir une gestion robuste et un échappement des entrées utilisateur.

Jetons un coup d'œil à un exemple dans lequel nous utiliserons le SDK .Net. Voici le code qui supprimera la collection.

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); 
}

La construction d'une requête paramétrée est la suivante.

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

Nous ne codons pas en dur la collectionId, cette méthode peut donc être utilisée pour supprimer n'importe quelle collection. Nous pouvons utiliser le symbole «@» pour préfixer les noms de paramètres, similaire à SQL Server.

Dans l'exemple ci-dessus, nous recherchons une collection spécifique par Id où le paramètre Id est défini dans ce SqlParameterCollection affecté à la propriété du paramètre de ce SqlQuerySpec. Le SDK effectue ensuite le travail de construction de la chaîne de requête finale pour DocumentDB avec l'ID collection incorporé à l'intérieur. Nous exécutons la requête et utilisons ensuite son SelfLink pour supprimer la collection.

Voici l'implémentation de la tâche 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"); 
   } 
}

Lorsque le code est exécuté, il produit la sortie suivante.

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

Jetons un œil à un autre exemple. Nous pouvons écrire une requête qui prend le nom et l'état de l'adresse comme paramètres, puis l'exécute pour diverses valeurs de lastname et location.state en fonction de l'entrée de l'utilisateur.

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

Cette demande peut ensuite être envoyée à DocumentDB en tant que requête JSON paramétrée, comme indiqué dans le code suivant.

{       
   "query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND 
      f.location.state = @addressState", 
		
   "parameters": [           
      {"name": "@lastName", "value": "Wakefield"},          
      {"name": "@addressState", "value": "NY"},            
   ]  
}