为了重用相同的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/