DocumentDB SQL - Parametriert
In relationalen Datenbanken ist eine parametrisierte Abfrage eine Abfrage, bei der Platzhalter für Parameter verwendet werden und die Parameterwerte zur Ausführungszeit angegeben werden. DocumentDB unterstützt auch parametrisierte Abfragen, und Parameter in parametrisierten Abfragen können mit der bekannten @ -Notation ausgedrückt werden. Der wichtigste Grund für die Verwendung parametrisierter Abfragen ist die Vermeidung von SQL-Injection-Angriffen. Es kann auch eine robuste Handhabung und das Entkommen von Benutzereingaben ermöglichen.
Schauen wir uns ein Beispiel an, in dem wir das .Net SDK verwenden werden. Es folgt der Code, mit dem die Sammlung gelöscht wird.
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);
}
Der Aufbau einer parametrisierten Abfrage ist wie folgt.
var query = new SqlQuerySpec {
QueryText = "SELECT * FROM c WHERE c.id = @id",
Parameters = new SqlParameterCollection { new SqlParameter { Name =
"@id", Value = collectionId } }
};
Wir haben die collectionId nicht fest codiert, daher kann diese Methode verwendet werden, um jede Sammlung zu löschen. Wir können das Symbol '@' verwenden, um Parameternamen ähnlich wie bei SQL Server voranzustellen.
Im obigen Beispiel fragen wir nach einer bestimmten Auflistung nach ID, wobei der ID-Parameter in dieser SqlParameterCollection definiert ist, die der Eigenschaft des Parameters dieser SqlQuerySpec zugewiesen ist. Das SDK erstellt dann die endgültige Abfragezeichenfolge für DocumentDB mit der darin eingebetteten collectionId. Wir führen die Abfrage aus und löschen dann mit ihrem SelfLink die Sammlung.
Im Folgenden finden Sie die Implementierung der CreateDocumentClient-Task.
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");
}
}
Wenn der Code ausgeführt wird, wird die folgende Ausgabe erzeugt.
**** Delete Collection MyCollection1 in mydb ****
Deleted collection MyCollection1 from database myfirstdb
**** Delete Collection MyCollection2 in mydb ****
Deleted collection MyCollection2 from database myfirstdb
Schauen wir uns ein anderes Beispiel an. Wir können eine Abfrage schreiben, die Nachname und Adressstatus als Parameter verwendet und diese dann für verschiedene Werte von Nachname und Standort.Status basierend auf der Benutzereingabe ausführt.
SELECT *
FROM Families f
WHERE f.lastName = @lastName AND f.location.state = @addressState
Diese Anforderung kann dann als parametrisierte JSON-Abfrage an DocumentDB gesendet werden, wie im folgenden Code gezeigt.
{
"query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND
f.location.state = @addressState",
"parameters": [
{"name": "@lastName", "value": "Wakefield"},
{"name": "@addressState", "value": "NY"},
]
}