diff --git a/src/NHibernate/Driver/NpgsqlDriver.cs b/src/NHibernate/Driver/NpgsqlDriver.cs index ccfd2dc1be2..c638e256221 100644 --- a/src/NHibernate/Driver/NpgsqlDriver.cs +++ b/src/NHibernate/Driver/NpgsqlDriver.cs @@ -65,19 +65,33 @@ public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplement protected override void InitializeParameter(DbParameter dbParam, string name, SqlTypes.SqlType sqlType) { - base.InitializeParameter(dbParam, name, sqlType); + if (sqlType == null) + throw new QueryException($"No type assigned to parameter '{name}'"); - // Since the .NET currency type has 4 decimal places, we use a decimal type in PostgreSQL instead of its native 2 decimal currency type. + dbParam.ParameterName = FormatNameForParameter(name); if (sqlType.DbType == DbType.Currency) + { + // Since the .NET currency type has 4 decimal places, we use a decimal type in PostgreSQL instead of its native 2 decimal currency type. dbParam.DbType = DbType.Decimal; + } + else if (DriverVersionMajor < 6 || sqlType.DbType != DbType.DateTime) + { + dbParam.DbType = sqlType.DbType; + } + else + { + // Let Npgsql 6 driver to decide parameter type + } } // Prior to v3, Npgsql was expecting DateTime for time. // https://github.com/npgsql/npgsql/issues/347 - public override bool RequiresTimeSpanForTime => (DriverVersion?.Major ?? 3) >= 3; + public override bool RequiresTimeSpanForTime => DriverVersionMajor >= 3; public override bool HasDelayedDistributedTransactionCompletion => true; System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(GenericBatchingBatcherFactory); + + private int DriverVersionMajor => DriverVersion?.Major ?? 3; } }