DocumentDB SQL - parametrizzato

Nei database relazionali, una query con parametri è una query in cui vengono utilizzati segnaposto per i parametri ei valori dei parametri vengono forniti al momento dell'esecuzione. DocumentDB supporta anche query con parametri e i parametri nella query con parametri possono essere espressi con la nota notazione @. Il motivo più importante per utilizzare le query con parametri è evitare attacchi di SQL injection. Può anche fornire una gestione robusta e sfuggire all'input dell'utente.

Diamo un'occhiata a un esempio in cui utilizzeremo .Net SDK. Di seguito è riportato il codice che cancellerà la raccolta.

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 costruzione di una query parametrizzata è la seguente.

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

Non stiamo codificando l'ID della raccolta, quindi questo metodo può essere utilizzato per eliminare qualsiasi raccolta. Possiamo usare il simbolo "@" per aggiungere un prefisso ai nomi dei parametri, in modo simile a SQL Server.

Nell'esempio precedente, stiamo eseguendo una query per una raccolta specifica tramite Id in cui il parametro Id è definito in questo SqlParameterCollection assegnato alla proprietà del parametro di questo SqlQuerySpec. L'SDK esegue quindi il lavoro di costruzione della stringa di query finale per DocumentDB con collectionId incorporato al suo interno. Eseguiamo la query e quindi utilizziamo il suo SelfLink per eliminare la raccolta.

Di seguito è riportata l'implementazione dell'attività 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"); 
   } 
}

Quando il codice viene eseguito, produce il seguente output.

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

Diamo un'occhiata a un altro esempio. Possiamo scrivere una query che prende il cognome e lo stato dell'indirizzo come parametri, quindi la esegue per vari valori di lastname e location.state in base all'input dell'utente.

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

Questa richiesta può quindi essere inviata a DocumentDB come query JSON con parametri, come mostrato nel codice seguente.

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