为了重用相同的DbCommand并在每次需要访问同一请求中的数据库时不初始化新的连接,我创建了一个方法来保存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()}

最佳答案

……而且每次我需要在同一请求中访问数据库时,都不会建立新的连接


与大多数其他ADO.NET实现一样,Npgsql也具有连接池,因此,只要您Dispose()连接对象,除非有同时查询,否则基础连接将被重用。不要修复临时连接池中的错误,只需使用已经提供给您的错误即可。

关于c# - ASP.Net Core Npgsql操作已在进行中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39708384/

10-10 00:25