You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JS调用执行SQL事务的C# POST接口及排查调用失败问题

问题解答

当然可以用POST方式调用这个接口,核心思路没问题,只是几个细节处理不到位导致调用失败。下面是问题分析和修正后的实现方案:

后端C#代码的问题与修正

1. 模型绑定缺失[FromBody]特性

ASP.NET Core不会自动从JSON请求体绑定复杂类型参数,必须给combustible参数加上[FromBody]标记,否则无法正确接收前端传递的JSON数据。

2. 返回值设计不合理

返回void无法给前端反馈请求状态(成功/失败),建议返回Task<IActionResult>(符合Web API异步规范),这样能明确返回HTTP状态码和错误信息,方便前端处理。

3. SQL语句存在注入风险

注释里的ExecuteSqlRaw用了字符串拼接,这是严重的安全隐患,必须改用参数化查询。

修正后的后端代码

[HttpPost]
[Route("Transaccion")]
public async Task<IActionResult> TransactionCombustible([FromBody] Models_Custom.combustible combustible)
{
    // 先校验参数合法性
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    using var dbContextTransaction = await contextCustom.Database.BeginTransactionAsync();
    try
    {
        // 参数化INSERT示例(替换为你的实际字段)
        await contextCustom.Database.ExecuteSqlRawAsync(
            "INSERT INTO ADM.parametros_combustible (campo1, campo2, id_combustible) VALUES (@campo1, @campo2, @idCombustible)",
            new SqlParameter("@campo1", combustible.Campo1),
            new SqlParameter("@campo2", combustible.Campo2),
            new SqlParameter("@idCombustible", combustible.IdCombustible)
        );

        // 参数化UPDATE示例
        var activo = false; // 替换为你的实际业务逻辑值
        await contextCustom.Database.ExecuteSqlRawAsync(
            "UPDATE ADM.combustible SET activo = @activo WHERE id = @idCombustible",
            new SqlParameter("@activo", activo),
            new SqlParameter("@idCombustible", combustible.IdCombustible)
        );

        await contextCustom.SaveChangesAsync();
        await dbContextTransaction.CommitAsync();

        return Ok("事务执行成功");
    }
    catch (Exception ex)
    {
        await dbContextTransaction.RollbackAsync();
        // 可添加日志记录,这里返回错误信息给前端
        return StatusCode(500, $"事务执行失败:{ex.Message}");
    }
}

前端JS代码的问题与修正

1. 缺少错误处理逻辑

当前fetch只处理了请求成功的回调,没有处理HTTP错误(比如400、500状态码),导致调用失败时前端无法定位问题。

修正后的前端代码

let guardarModificarCombustible = (combustible) => {
    console.log(combustible);
    fetch(urlController + "/Transaccion", {
        method: 'POST',
        headers: {
            "Content-Type": "application/json; charset=utf-8"
        },
        body: JSON.stringify(combustible)
    })
    .then(response => {
        if (!response.ok) {
            // 处理HTTP错误,提取后端返回的错误信息
            return response.text().then(errMsg => { throw new Error(errMsg); });
        }
        return response.text();
    })
    .then(msg => {
        console.log(msg);
        obtenerCombustibles();
        setMostrarModal(false);
    })
    .catch(err => {
        // 捕获所有错误并提示用户
        console.error("调用失败:", err);
        alert("操作失败,请稍后重试:" + err.message);
    });
}

额外注意事项

  • 确保Models_Custom.combustible类的属性名称和前端传递的JSON字段名称完全一致(大小写敏感,若需自定义映射可使用[JsonPropertyName]特性)。
  • 若项目基于ASP.NET Core 3.0+,默认已内置JSON序列化支持,无需额外配置。
  • 建议在后端添加日志记录,方便排查事务执行过程中的异常。

内容的提问来源于stack exchange,提问作者Alejo Percudani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:55:38