diff --git a/src/NHibernate/AdoNet/MySqlDbDataReader.cs b/src/NHibernate/AdoNet/MySqlDbDataReader.cs new file mode 100644 index 0000000000..6033b1cca3 --- /dev/null +++ b/src/NHibernate/AdoNet/MySqlDbDataReader.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NHibernate.AdoNet +{ + public class MySqlDbDataReader : DbDataReaderWrapper + { + public MySqlDbDataReader(DbDataReader reader) : base(reader) { } + + // MySql driver has a bug that incorrectly uses the CurrentCulture to parse strings. + public override float GetFloat(int ordinal) + { + var value = DataReader[ordinal]; + + return value switch + { + string => Convert.ToSingle(value, CultureInfo.InvariantCulture), + _ => (float) value + }; + } + + public override double GetDouble(int ordinal) + { + var value = DataReader[ordinal]; + + return value switch + { + string => Convert.ToDouble(value, CultureInfo.InvariantCulture), + _ => (double) value + }; + } + + public override decimal GetDecimal(int ordinal) + { + var value = DataReader[ordinal]; + + return value switch + { + string => Convert.ToDecimal(value, CultureInfo.InvariantCulture), + _ => (decimal) value + }; + } + } +} diff --git a/src/NHibernate/Async/Driver/MySqlDataDriver.cs b/src/NHibernate/Async/Driver/MySqlDataDriver.cs new file mode 100644 index 0000000000..79af11a3ca --- /dev/null +++ b/src/NHibernate/Async/Driver/MySqlDataDriver.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System; +using System.Data.Common; +using NHibernate.AdoNet; + +namespace NHibernate.Driver +{ + using System.Threading.Tasks; + using System.Threading; + public partial class MySqlDataDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider + { + + public override async Task ExecuteReaderAsync(DbCommand command, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + var reader = await (command.ExecuteReaderAsync(cancellationToken)).ConfigureAwait(false); + + return new MySqlDbDataReader(reader); + } + } +} diff --git a/src/NHibernate/Driver/MySqlDataDriver.cs b/src/NHibernate/Driver/MySqlDataDriver.cs index efbe9675f9..418f711498 100644 --- a/src/NHibernate/Driver/MySqlDataDriver.cs +++ b/src/NHibernate/Driver/MySqlDataDriver.cs @@ -1,4 +1,5 @@ using System; +using System.Data.Common; using NHibernate.AdoNet; namespace NHibernate.Driver @@ -17,7 +18,7 @@ namespace NHibernate.Driver /// for any updates and/or documentation regarding MySQL. /// /// - public class MySqlDataDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider + public partial class MySqlDataDriver : ReflectionBasedDriver, IEmbeddedBatcherFactoryProvider { /// /// Initializes a new instance of the class. @@ -79,6 +80,13 @@ public override IResultSetsCommand GetResultSetsCommand(Engine.ISessionImplement /// public override DateTime MinDate => new DateTime(1000, 1, 1); + public override DbDataReader ExecuteReader(DbCommand command) + { + var reader = command.ExecuteReader(); + + return new MySqlDbDataReader(reader); + } + System.Type IEmbeddedBatcherFactoryProvider.BatcherFactoryClass => typeof(MySqlClientBatchingBatcherFactory); } }