sql-server - 在 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
帮我.. :-(
解决方案
您不能返回 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;
推荐阅读
- amazon-web-services - 带有 SSH 身份验证的 WinSCP 到 S3
- r - 用日期值替换字符日期
- java - B4A:在安卓上转接电话
- python - Python:Selenium - 消息:元素不可交互
- redis - redis/debian:在哪里可以找到配置文件
- postgresql - 在辅助卷上的 AWS EC2 CentOS 7 中安装 Postgresql
- python - 在 python 中共享变量
- ubuntu - COBOL 顺序文件 I/O
- javascript - Angular2 HttpClient 获取响应应用程序/javascript 的请求被解析为 JSON,但我希望它们是“eval”
- kubernetes - K8s 对 DigitalOcean 存储桶中静态资产的入口