📅  最后修改于: 2020-11-28 13:39:28             🧑  作者: Mango
如今,JavaScript无处不在,而不仅仅是在浏览器中。 DocumentDB将JavaScript视为一种现代的T-SQL,并在数据库引擎内部直接支持JavaScript逻辑的事务执行。 DocumentDB提供了一种编程模型,用于根据存储过程和触发器直接在集合上执行基于JavaScript的应用程序逻辑。
让我们看一个创建简单存储过程的示例。以下是步骤-
步骤1-创建一个新的控制台应用程序。
步骤2-从NuGet中添加.NET SDK。我们在这里使用.NET SDK,这意味着我们将编写一些C#代码来创建,执行和删除存储过程,但是存储过程本身是用JavaScript编写的。
步骤3-在解决方案资源管理器中右键单击项目。
步骤4-为该存储过程添加一个新的JavaScript文件,并将其命名为HelloWorldStoreProce.js
每个存储过程只是一个JavaScript函数,所以我们将创建一个新的函数,当然我们也将其命名这个函数HelloWorldStoreProce。我们是否为函数命名都没有关系。 DocumentDB将仅通过创建时提供的ID来引用此存储过程。
function HelloWorldStoreProce() {
var context = getContext();
var response = context.getResponse();
response.setBody('Hello, and welcome to DocumentDB!');
}
存储过程所做的就是从上下文中获取响应对象,并调用其setBody方法以将字符串返回给调用方。在C#代码中,我们将创建存储过程,执行该过程,然后将其删除。
存储过程是每个集合的作用域,因此我们将需要集合的SelfLink来创建存储过程。
步骤5-首先查询myfirstdb数据库,然后查询MyCollection集合。
创建存储过程就像在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);
}
}
步骤6-首先使用新资源的ID创建一个定义对象,然后在DocumentClient对象上调用Create方法之一。对于存储过程,该定义包括ID和要传递到服务器的实际JavaScript代码。
步骤7-调用File.ReadAllText以从JS文件中提取存储过程代码。
步骤8-将存储过程代码分配给定义对象的body属性。
就DocumentDB而言,我们在定义中在此处指定的ID是存储过程的名称,而不管我们实际上将JavaScript函数命名为什么。
但是,在创建存储过程和其他服务器端对象时,建议我们命名JavaScript函数,并且这些函数名应与我们在DocumentDB的定义中设置的ID匹配。
第9步-呼叫CreateStoredProcedureAsync,传递SelfLink为MyCollection的收集和存储过程定义。这将创建存储过程和DocumentDB分配给它的ResourceId 。
步骤10-调用存储过程。 ExecuteStoredProcedureAsync采用一个类型参数,该参数设置为存储过程返回的值的预期数据类型,如果要返回动态对象,则可以简单地将其指定为对象。那是一个对象,其属性将在运行时绑定。
在此示例中,我们知道存储过程仅返回一个字符串,因此我们调用ExecuteStoredProcedureAsync < 字符串> 。
以下是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(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);
}
}
}
}
执行以上代码后,将产生以下输出。
Created stored procedure HelloWorldStoreProce (Ic8LAMEUVgACAAAAAAAAgA==)
Executed stored procedure; response = Hello, and welcome to DocumentDB!
如上面的输出所示,response属性具有“您好,欢迎来到DocumentDB!”。由我们的存储过程返回。