如何在 Azure 上为 SQL 存储过程创建 API 包装器

How to create API wrapper for SQL stored procedure on Azure

提问人:Vojtěch Dohnal 提问时间:11/15/2023 最后编辑:Vojtěch Dohnal 更新时间:11/20/2023 访问量:85

问:

我在 Azure SQL 数据库上有一个存储过程,我可以用它来执行

EXEC [dbo].[PGET_JSON] @code = N'XYZ'

它返回 FOR JSON 结果

{
  "XX": [
    {
      "DocOstatni": [
        {
          "Type": "Something",
          "Published": "2023-08-28T20:14:18.617",
          "Order": 1,
          "Name": "Something",
          "File": "PV_XXX_6.PDF",
        },{ ...

我需要在 Azure 中创建一个 (.net?) 应用程序,该应用程序将在公共 URL 上公开此存储过程的结果,参数@code如下

myappid.azurewebsites.net/XYZ

这将返回带有参数的存储过程的输出。[PGET_JSON]@code='XYZ'

我在 Azure 上需要什么,应该使用什么类型的 Azure 服务,我应该使用 Azure Web 应用程序还是其他东西,最简单、最便宜的解决方案是什么?

我已经有一个 Azure Web 应用程序,也许将一个 sipmle API 添加到现有应用程序会更好?

C# sql-server azure-web-app-service azure-sql-database azure-webapps

评论

2赞 Dan Guzman 11/15/2023
请考虑使用 Azure 函数来生成无服务器 REST API。
1赞 Vojtěch Dohnal 11/15/2023
如果我已经有一个 Azure Web 应用,那么将 rest api 添加到现有应用的成本会不会低得多?

答:

1赞 Vivek Vaibhav Shandilya 11/16/2023 #1

如果我已经有一个 Azure Web 应用,那么将 rest api 添加到现有应用的成本会不会低得多?

使用基于消耗的函数应用比使用 Azure Web 应用成本更低。

正如@Dan Guzmann 建议使用 Azure Function。

我已使用 Azure 函数来获取存储过程。它对我有用。

#My 存储过程enter image description here

我在 azure 函数中使用了 HTTP 触发器。

#My 代码:

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Data;
using Microsoft.Data.SqlClient;

namespace FunctionApp6
{
    public static class Function1
    {
        [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string code = req.Query["code"];
            if (string.IsNullOrEmpty(code))
            {
                return new BadRequestObjectResult("Please provide a valid code parameter.");
            }

            string connectionString = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                connection.Open();

                using (SqlCommand command = new SqlCommand("PGET_JSON", connection))
                {
                    command.CommandType = CommandType.StoredProcedure;
                    command.Parameters.AddWithValue("@code", code);

                    using (SqlDataAdapter adapter = new SqlDataAdapter (command))
                    {
                        DataTable dataTable = new DataTable();
                        adapter.Fill(dataTable);

                        if (dataTable.Rows.Count>0)
                        {
                            
                            string result = JsonConvert.SerializeObject(dataTable);

                            return new OkObjectResult(result);
                        }
                        else
                        {
                            return new NotFoundObjectResult("No data found");
                        }
                    }
                }
            }
        }
    }
}

输出

[{"Id":123,"Name":"Vivek"}]

#Local: enter image description here

enter image description here

#AZURE:

enter image description here

评论

0赞 Vojtěch Dohnal 11/16/2023
谢谢,我现在正在使用现有的网络应用程序......但是,在发布到 Azure 后,路由停止工作...
0赞 Vivek Vaibhav Shandilya 11/17/2023
@VojtěchDohnal 您能否让我知道您使用的框架 Web 应用程序还是控制台应用程序.net