首页 > 解决方案 > 在 ASP.NET Core Web API 中传递 SQL Server 过程的参数后如何获取数据?

问题描述

我想使用传递一些参数的过程从 SQL Server 数据库中获取数据。这是正确的方法吗?此处显示的代码不起作用。有没有办法获取数据?

我想打电话

控制器:

[Route("api/[controller]")]
[ApiController]
public class ReportController : ControllerBase
{
    public IConfiguration Configuration { get; }
    private readonly DatabaseContext _context;

    public ReportController(IConfiguration configuration, DatabaseContext context)
    {
        Configuration = configuration;
        _context = context;
    }

    [Route("AllCollectionReport")]
    [HttpGet]
    public IActionResult CollectionReport()
    {
        DataTable dt = new DataTable();
        string imsConn = Configuration["ConnectionStrings:IMSConnection"];

        using (SqlConnection con = new SqlConnection(imsConn))
        {
            string query = "KK_SP_VIEWREPO"; //<-- Here is the procedure

            using (SqlCommand cmd = new SqlCommand(query))
            {
                cmd.Connection = con;

                using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
                {
                    sda.Fill(dt);
                }
            }
        }

        return Ok(dt);
    }
}

SQL查询:

CREATE PROCEDURE KK_SP_VIEWREPO
AS 
BEGIN
    SELECT * 
    FROM KK_SalesEntry
END

这是我在 Postman 中调用该方法后得到的错误 - 这段代码有什么问题吗?

Get: https://localhost:44372/api/Report/AllCollectionReport

错误:System.Text.Json.JsonException:检测到不支持的可能对象循环。这可能是由于循环或对象深度大于最大允许深度 32 造成的。

在 System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerCycleDetected(Int32 maxDepth)
在 System.Text.Json.JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state)
在 Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) 在 Microsoft.AspNetCore. Mvc.Formatters.SystemTextJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters() --- 在 Microsoft.AspNetCore 中从先前抛出异常的位置结束堆栈跟踪.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用程序,Task lastTask,State next,Scope 范围,Object state,Boolean isCompleted)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序,Task 任务, IDisposable 范围)在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.调用(HttpContext 上下文)

标题

Accept: */*
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Host: localhost:44372
User-Agent: PostmanRuntime/7.26.5
Postman-Token: d65e0dd3-3c9d-4066-ba8f-db7940509c60

帮我.. :-(

标签: sql-serverasp.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


您不能返回 DataTable。它不可序列化。您可以返回强类型对象。

这样的事情可能会有所帮助

    List<Object> objList = new List<Object>();

    using (SqlCommand cmd = new SqlCommand(query))
    {
        cmd.Connection = con;

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read()) {
                 objList.Add(new { 
                     UserId = reader[0].ToString()
                     UserName = raeder[1].ToString()
                 });
            }
        }
    }

    return objList;

推荐阅读