DocumentDB SQL - Parametreli

İlişkisel veritabanlarında, parametreli sorgu, parametreler için yer tutucuların kullanıldığı ve parametre değerlerinin yürütme zamanında sağlandığı bir sorgudur. DocumentDB ayrıca parametreli sorguları da destekler ve parametreli sorgudaki parametreler tanıdık @ gösterimiyle ifade edilebilir. Parametreli sorguları kullanmanın en önemli nedeni, SQL enjeksiyon saldırılarını önlemektir. Ayrıca, kullanıcı girdisinin sağlam bir şekilde işlenmesini ve kaçılmasını sağlayabilir.

Net SDK'yı kullanacağımız bir örneğe göz atalım. Koleksiyonu silecek kod aşağıdadır.

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

Parametreli bir sorgunun yapısı aşağıdaki gibidir.

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

CollectionId'yi kodlamıyoruz, bu nedenle bu yöntem herhangi bir koleksiyonu silmek için kullanılabilir. Parametre adlarının önüne SQL Server'a benzer şekilde '@' sembolünü kullanabiliriz.

Yukarıdaki örnekte, bu SqlQuerySpec parametresinin özelliğine atanan bu SqlParameterCollection içinde Id parametresinin tanımlandığı Id'ye göre belirli bir koleksiyonu sorguluyoruz. SDK daha sonra içine gömülü collectionId ile DocumentDB için son sorgu dizesini oluşturma işini yapar. Sorguyu çalıştırıyoruz ve ardından koleksiyonu silmek için SelfLink'i kullanıyoruz.

Aşağıdaki CreateDocumentClient görev uygulamasıdır.

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

Kod yürütüldüğünde, aşağıdaki çıktıyı üretir.

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

Başka bir örneğe bakalım. Soyadı ve adres durumunu parametre olarak alan bir sorgu yazabilir ve ardından kullanıcı girdisine bağlı olarak çeşitli soyad ve konum.state değerleri için çalıştırabiliriz.

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

Bu istek daha sonra aşağıdaki kodda gösterildiği gibi DocumentDB'ye parametreli JSON sorgusu olarak gönderilebilir.

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