ASP.操作正在进行中

本文关键字:进行中 操作 ASP | 更新日期: 2023-09-27 18:09:05

为了重用相同的DbCommand,而不是每次我需要在同一请求中访问DB时都建立一个新的连接,我创建了一个方法来保存DbCommand,并在它以前实例化时返回它:

public static class InformacionInscripcionesViewModel {
        private static NpgsqlConnection _dbConnection;
        private static NpgsqlCommand _dbCommand;
        private static NpgsqlCommand GetDbCommand() {
            InformacionInscripcionesViewModel._dbConnection = InformacionInscripcionesViewModel._dbConnection ?? new NpgsqlConnection("Host=192.168.1.127;Username=siu;Password=123456;Database=guaraniprueba20160816");
            if (InformacionInscripcionesViewModel._dbConnection.State == ConnectionState.Closed)
                InformacionInscripcionesViewModel._dbConnection.Open();
            return InformacionInscripcionesViewModel._dbCommand
                   ?? (InformacionInscripcionesViewModel._dbCommand = new NpgsqlCommand {Connection = InformacionInscripcionesViewModel._dbConnection});
        }
}

在模型中如何使用的示例:

var dbCommand = InformacionInscripcionesViewModel.GetDbCommand();
dbCommand.CommandText = @"SELECT sga_propuestas.nombre_abreviado AS nombre_carrera, ....";
dbCommand.ExecuteNonQuery();

当我使用它向一个URL同时发出2个请求时,它在dbCommand.ExecuteNonQuery();抛出一个异常,消息为An operation is already in progress

我能做些什么来防止这种情况?DbCommand每次使用前都要速溶吗?有什么头绪吗?

{System.InvalidOperationException: An operation is already in progress.
   at Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState)
   at Npgsql.NpgsqlCommand.ExecuteNonQueryInternal()
   at Npgsql.NpgsqlCommand.ExecuteNonQuery()
   at SIUNPAZ.Models.InformacionInscripcionesViewModels.InformacionInscripcionesViewModel.GetTotalesInscripcionesPorMaterias(DateTime fechaDesde, DateTime fechaHasta, String carrera)
   at SIUNPAZ.Controllers.InformacionInscripcionesController.PorMaterias(DateTime fechaDesde, DateTime fechaHasta, String carrera)
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.AspNetCore.Mvc.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionFilterAsync>d__28.MoveNext()}

ASP.操作正在进行中

…,而不是每次我需要在同一个请求中访问DB时都建立新的连接

像大多数其他ADO一样。. NET实现中,Npgsql具有连接池,因此只要您Dispose()连接对象,底层连接将被重用,除非有并发查询。不要修复ad-hoc连接池中的错误,只需使用已经给您的连接池

你不能在请求之间共享DB连接,这实际上是你通过使它们静态所做的。在单个请求中为多个命令共享单个连接是可以的,但是它的生命周期应该与请求的生命周期相关联。作为开始,你可以删除"静态",你的代码应该运行。你可能想要查看IoC容器(Unity, Ninject, StructureMap等)来为你创建连接,并在你的构造函数中请求它们。大多数都有生命周期管理器,可以自动将对象限定为HTTP请求。

通常认为在ViewModels中使用逻辑是不好的做法。ViewModels不应该有DbConnections。您应该考虑为数据访问创建服务,或者将DB代码移动到控制器中。