【问题标题】:Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near ','Microsoft.Data.SqlClient.SqlException (0x80131904):“,”附近的语法不正确
【发布时间】:2020-05-14 10:55:22
【问题描述】:

我认为这可能是语法错误,但我找不到。

这是完整的错误:

Microsoft.Data.SqlClient.SqlException (0x80131904):语法不正确 靠近 ','。在 Microsoft.Data.SqlClient.SqlCommand.c.b__164_0(Task1 result) at System.Threading.Tasks.ContinuationResultTaskFromResultTask2.InnerInvoke() 在 System.Threading.Tasks.Task.c.<.cctor>b__274_0(Object obj) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Threading.Tasks.Task.ExecuteWithThreadLocal(任务& currentTaskSlot,线程线程池线程) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject 参数对象,CancellationToken 取消令牌)在 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject 参数对象,CancellationToken 取消令牌)在 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject 参数对象,CancellationToken 取消令牌)在 Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.AsyncEnumerator.InitializeReaderAsync(DbContext _, Boolean result, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func4 操作,Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.AsyncEnumerator.MoveNextAsync() 在 Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 source, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable1 来源,CancellationToken 取消令牌)在 FincredixAppBigBrotherWebApi.Application.Sucursales.Queries.GetAllSucursales.GetAllSucursalesHandler.Handle(GetAllSucursalesQuery 请求,CancellationToken 取消令牌)在 C:\Users\alozano\source\repos\FincredixAppBigBrotherWebApi\FincredixAppBigBrotherWebApi.Application\Sucursales\Queries\GetAllSucursales\GetAllSucursalesHandler.cs:line 28 在 MediatR.Pipeline.RequestPreProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPreProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPreProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 MediatR.Pipeline.RequestPreProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 下一个)在 FincredixAppBigBrotherWebApi.WebApi.Controllers.SucursalController.GetAll(Int32 claSucursal,Int32 claSucursalPadre,Int32 bajaLogica,字符串 描述)在 C:\Users\alozano\source\repos\FincredixAppBigBrotherWebApi\FincredixAppBigBrotherWebApi.WebApi\Controllers\SucursalController.cs:line 19 at lambda_method(Closure, Object) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() 在 Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper 映射器,ObjectMethodExecutor 执行器,对象控制器,Object[] 论据)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker 调用者,ValueTask`1 actionResultValueTask) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值 已完成)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed 上下文)在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态& next, Scope& 范围, Object& 状态, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值 已完成)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|19_0(ResourceInvoker 调用者,任务 lastTask,下一个状态,作用域范围,对象状态,布尔值 已完成)在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用者、任务任务、IDisposable 范围)在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点 端点,任务 requestTask,ILogger 记录器)在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文)在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)ClientConnectionId:25b62d0a-cacd-4e27-aa37-90c4cd002382 错误 编号:102,状态:1,等级:15

标题 ======= Cache-Control: no-cache Connection: keep-alive Accept: / Accept-Encoding: gzip, deflate, br Host: localhost:5001 User-Agent: PostmanRuntime/7.22.0 邮递员令牌: bdd4ae12-be9d-4d55-9753-36f00ca7029c

这是我怀疑的代码行

在 FincredixAppBigBrotherWebApi.Application.Sucursales.Queries.GetAllSucursales.GetAllSucursalesHandler.Handle(GetAllSucursalesQuery 请求,CancellationToken 取消令牌)在 C:\Users\alozano\source\repos\FincredixAppBigBrotherWebApi\FincredixAppBigBrotherWebApi.Application\Sucursales\Queries\GetAllSucursales\GetAllSucursalesHandler.cs:line 28

这是第 28 行:

public async Task<List<SucursalViewModel>> Handle(GetAllSucursalesQuery request, CancellationToken cancellationToken)
{
    var response = this._mapper.Map<List<SucursalViewModel>>(await this._fincredixAppDbContext.SpAppFcxSucursalSel.FromSqlRaw(
                    $@"{SpConstants.SpAppFcxSucursalSel}
                    @pnClaSucursal = { request.ClaSucursal },
                    @psDescripcion = { request.Descripcion },
                    @pnClaSucursalPadre = { request.ClaSucursalPadre },
                    @pnIncBajaLogica = { request.BajaLogica }")
                    .AsNoTracking().ToListAsync(cancellationToken));
    return response;
}

我已经看到很多与这个问题非常相似的问题,但不正确的语法是“?”或 ')' 或 'from' 或 '/' 等。我的是 ','

【问题讨论】:

  • 不要用字符串连接构建 SQL。使用参数化查询。
  • 如果您的任何变量包含 SQL 特殊字符,您可能会收到此错误。听从丹尼尔的建议。
  • 我知道如何进行参数化查询,但在目前我必须返回某个 ViewModel 列表的情况下,加上它必须是异步的。
  • 运行时产生的 SQL 查询是什么?冒着听起来讽刺的风险,我认为我们应该在“,”附近寻找语法错误
  • 在 SSMS 中执行 exec 时存储过程运行良好,所以我知道问题不在于 sp。是的,我听到了,这不是讽刺,一定是缺少逗号或多余的逗号。我只是不知道在哪里。

标签: c# sql-server api asp.net-core stored-procedures


【解决方案1】:

不应该是:

 $@"{SpConstants.SpAppFcxSucursalSel}
                    @pnClaSucursal = '{request.ClaSucursal}',
                    @psDescripcion = '{request.Descripcion}',
                    @pnClaSucursalPadre = '{request.ClaSucursalPadre}',
                    @pnIncBajaLogica = '{request.BajaLogica}'")

【讨论】:

  • 我会在早上尝试第一件事,但我有疑问,因为当我在该行调试并设置断点时,当我将鼠标悬停在 4 个参数上时,它们具有预期值来自请求。
  • 做到了!将请求参数放在单引号内使它像一个魅力一样工作,非常感谢。
猜你喜欢
  • 2014-12-18
  • 2018-06-28
  • 2010-11-27
  • 1970-01-01
  • 2019-09-12
  • 2015-12-12
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多