DocumentDB SQL - integracja JavaScript
Obecnie JavaScript jest wszędzie, nie tylko w przeglądarkach. DocumentDB obejmuje JavaScript jako rodzaj współczesnego T-SQL i obsługuje transakcyjne wykonywanie logiki JavaScript natywnie, bezpośrednio w silniku bazy danych. DocumentDB zapewnia model programowania do wykonywania logiki aplikacji opartej na języku JavaScript bezpośrednio w kolekcjach pod względem procedur składowanych i wyzwalaczy.
Spójrzmy na przykład, w którym tworzymy prostą procedurę sklepu. Oto kroki -
Step 1 - Utwórz nowe aplikacje konsolowe.
Step 2- Dodaj zestaw .NET SDK z NuGet. Używamy tutaj zestawu .NET SDK, co oznacza, że będziemy pisać kod w języku C #, aby utworzyć, wykonać, a następnie usunąć naszą procedurę składowaną, ale sama procedura składowana zostanie napisana w języku JavaScript.
Step 3 - Kliknij prawym przyciskiem myszy projekt w eksploratorze rozwiązań.
Step 4 - Dodaj nowy plik JavaScript dla procedury składowanej i nazwij go HelloWorldStoreProce.js
Każda procedura składowana jest po prostu funkcją JavaScript, więc utworzymy nową funkcję i oczywiście nadamy jej również nazwę HelloWorldStoreProce. Nie ma znaczenia, czy w ogóle nadamy funkcji nazwę. DocumentDB będzie odwoływać się do tej procedury składowanej tylko za pomocą identyfikatora, który podamy podczas jej tworzenia.
function HelloWorldStoreProce() {
var context = getContext();
var response = context.getResponse();
response.setBody('Hello, and welcome to DocumentDB!');
}
Wszystko, co robi procedura składowana, to uzyskanie obiektu odpowiedzi z kontekstu i wywołanie jego setBodymetoda, aby zwrócić ciąg do obiektu wywołującego. W kodzie C # utworzymy procedurę składowaną, wykonamy ją, a następnie usuniemy.
Zakres procedur składowanych obejmuje kolekcję, dlatego do utworzenia procedury składowanej będziemy potrzebować elementu SelfLink kolekcji.
Step 5 - Pierwsze zapytanie o myfirstdb bazy danych, a następnie dla MyCollection kolekcja.
Tworzenie procedury składowanej przypomina tworzenie dowolnego innego zasobu w usłudze DocumentDB.
private async static Task SimpleStoredProcDemo() {
var endpoint = "https://azuredocdbdemo.documents.azure.com:443/";
var masterKey =
"BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
using (var client = new DocumentClient(new Uri(endpoint), masterKey)) {
// Get database
Database database = client
.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'myfirstdb'")
.AsEnumerable()
.First();
// Get collection
DocumentCollection collection = client
.CreateDocumentCollectionQuery(database.CollectionsLink, "SELECT * FROM
c WHERE c.id = 'MyCollection'")
.AsEnumerable()
.First();
// Create stored procedure
var sprocBody = File.ReadAllText(@"..\..\HelloWorldStoreProce.js");
var sprocDefinition = new StoredProcedure {
Id = "HelloWorldStoreProce",
Body = sprocBody
};
StoredProcedure sproc = await client.
CreateStoredProcedureAsync(collection.SelfLink, sprocDefinition);
Console.WriteLine("Created stored procedure {0} ({1})",
sproc.Id, sproc.ResourceId);
// Execute stored procedure
var result = await client.ExecuteStoredProcedureAsync
(sproc.SelfLink); Console.WriteLine("Executed stored procedure; response = {0}", result.Response); // Delete stored procedure await client.DeleteStoredProcedureAsync(sproc.SelfLink); Console.WriteLine("Deleted stored procedure {0} ({1})", sproc.Id, sproc.ResourceId); } }
Step 6 - Najpierw utwórz obiekt definicji z identyfikatorem nowego zasobu, a następnie wywołaj jedną z metod Create w pliku DocumentClientobiekt. W przypadku procedury składowanej definicja zawiera identyfikator i rzeczywisty kod JavaScript, który ma zostać przesłany na serwer.
Step 7 - Zadzwoń File.ReadAllText aby wyodrębnić kod procedury składowanej z pliku JS.
Step 8 - Przypisz kod procedury składowanej do właściwości treści obiektu definicji.
Jeśli chodzi o DocumentDB, identyfikator, który tu podamy, w definicji, to nazwa procedury składowanej, niezależnie od tego, jak nazywamy funkcję JavaScript.
Niemniej jednak podczas tworzenia procedur składowanych i innych obiektów po stronie serwera zaleca się nadanie nazw funkcjom JavaScript i aby te nazwy funkcji były zgodne z identyfikatorem, który ustawiliśmy w definicji DocumentDB.
Step 9 - Zadzwoń CreateStoredProcedureAsync, przechodząc w SelfLink dla MyCollectionkolekcja i definicja procedury składowanej. Spowoduje to utworzenie procedury składowanej iResourceId przypisana do DocumentDB.
Step 10 - Wywołaj procedurę składowaną. ExecuteStoredProcedureAsyncprzyjmuje parametr typu, który ustawisz na oczekiwany typ danych wartości zwracanej przez procedurę składowaną, którą możesz określić po prostu jako obiekt, jeśli chcesz zwrócić obiekt dynamiczny. To jest obiekt, którego właściwości zostaną powiązane w czasie wykonywania.
W tym przykładzie wiemy, że nasza procedura składowana po prostu zwraca ciąg i dlatego wywołujemy ExecuteStoredProcedureAsync<string>.
Poniżej znajduje się pełna implementacja pliku Program.cs.
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocumentDBStoreProce {
class Program {
private static void Main(string[] args) {
Task.Run(async () => {
await SimpleStoredProcDemo();
}).Wait();
}
private async static Task SimpleStoredProcDemo() {
var endpoint = "https://azuredocdbdemo.documents.azure.com:443/";
var masterKey =
"BBhjI0gxdVPdDbS4diTjdloJq7Fp4L5RO/StTt6UtEufDM78qM2CtBZWbyVwFPSJIm8AcfDu2O+AfV T+TYUnBQ==";
using (var client = new DocumentClient(new Uri(endpoint), masterKey)) {
// Get database
Database database = client
.CreateDatabaseQuery("SELECT * FROM c WHERE c.id = 'myfirstdb'")
.AsEnumerable()
.First();
// Get collection
DocumentCollection collection = client
.CreateDocumentCollectionQuery(database.CollectionsLink,
"SELECT * FROM c WHERE c.id = 'MyCollection'")
.AsEnumerable()
.First();
// Create stored procedure
var sprocBody = File.ReadAllText(@"..\..\HelloWorldStoreProce.js");
var sprocDefinition = new StoredProcedure {
Id = "HelloWorldStoreProce",
Body = sprocBody
};
StoredProcedure sproc = await client
.CreateStoredProcedureAsync(collection.SelfLink, sprocDefinition);
Console.WriteLine("Created stored procedure {0} ({1})", sproc
.Id, sproc.ResourceId);
// Execute stored procedure
var result = await client
.ExecuteStoredProcedureAsync<string>(sproc.SelfLink);
Console.WriteLine("Executed stored procedure; response = {0}",
result.Response);
// Delete stored procedure
await client.DeleteStoredProcedureAsync(sproc.SelfLink);
Console.WriteLine("Deleted stored procedure {0} ({1})",
sproc.Id, sproc.ResourceId);
}
}
}
}
Kiedy powyższy kod jest wykonywany, generuje następujące dane wyjściowe.
Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)
Executed stored procedure; response = Hello, and welcome to DocumentDB!
Jak widać na powyższym wyjściu, właściwość response ma „Witaj i witaj w DocumentDB!” zwrócone przez naszą procedurę składowaną.