diff --git a/build-common/nhibernate-properties.xml b/build-common/nhibernate-properties.xml index 731b7291f0e..4b62e992a55 100644 --- a/build-common/nhibernate-properties.xml +++ b/build-common/nhibernate-properties.xml @@ -2,6 +2,6 @@ - + diff --git a/build-common/teamcity-hibernate.cfg.xml b/build-common/teamcity-hibernate.cfg.xml index a744013560e..0e038aa76ea 100644 --- a/build-common/teamcity-hibernate.cfg.xml +++ b/build-common/teamcity-hibernate.cfg.xml @@ -15,7 +15,7 @@ true - NHibernate.Driver.SqlClientDriver + NHibernate.Driver.Sql2008ClientDriver NHibernate.Dialect.MsSql2008Dialect Server=.\SQLExpress;initial catalog=nhibernate;Integrated Security=SSPI false diff --git a/doc/reference/modules/configuration.xml b/doc/reference/modules/configuration.xml index 6e65cd3cce8..72947b9af9e 100644 --- a/doc/reference/modules/configuration.xml +++ b/doc/reference/modules/configuration.xml @@ -1002,12 +1002,6 @@ ISession session = sessions.OpenSession(conn); - - NHibernate.Connection.DriverConnectionProvider - - - NHibernate.Driver.SqlClientDriver - Server=localhost;initial catalog=nhibernate;User Id=;Password= diff --git a/doc/reference/modules/example_weblog.xml b/doc/reference/modules/example_weblog.xml index 81c43714126..90159f6b2ee 100644 --- a/doc/reference/modules/example_weblog.xml +++ b/doc/reference/modules/example_weblog.xml @@ -333,9 +333,6 @@ namespace Eg NHibernate.Dialect.MsSql2012Dialect - - NHibernate.Connection.DriverConnectionProvider - Server=localhost\SQLEXPRESS;initial catalog=Eg;Integrated Security=True diff --git a/doc/reference/modules/quickstart.xml b/doc/reference/modules/quickstart.xml index 82e07fc1f6c..ee75ba405ea 100644 --- a/doc/reference/modules/quickstart.xml +++ b/doc/reference/modules/quickstart.xml @@ -52,9 +52,6 @@ NHibernate.Dialect.MsSql2012Dialect - - NHibernate.Connection.DriverConnectionProvider - Server=localhost\SQLEXPRESS;initial catalog=quickstart;Integrated Security=True diff --git a/src/NHibernate.Config.Templates/MSSQL.cfg.xml b/src/NHibernate.Config.Templates/MSSQL.cfg.xml index 70397662e4e..8e5706a5c56 100644 --- a/src/NHibernate.Config.Templates/MSSQL.cfg.xml +++ b/src/NHibernate.Config.Templates/MSSQL.cfg.xml @@ -7,10 +7,10 @@ for your own use before compile tests in VisualStudio. - NHibernate.Driver.SqlClientDriver + NHibernate.Driver.Sql2008ClientDriver Server=(local);initial catalog=nhibernate;Integrated Security=SSPI NHibernate.Dialect.MsSql2008Dialect - \ No newline at end of file + diff --git a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs index c4d0a9de046..663b9dfcbe8 100644 --- a/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs +++ b/src/NHibernate.Example.Web/Infrastructure/AppSessionFactory.cs @@ -24,7 +24,7 @@ public AppSessionFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFacto { db.ConnectionString = @"Server=(local)\SQLEXPRESS;initial catalog=nhibernate;Integrated Security=true"; db.Dialect(); - db.Driver(); + db.Driver(); }) .AddMapping(domainMapping); Configuration.SessionFactory().GenerateStatistics(); @@ -37,4 +37,4 @@ public ISession OpenSession() return SessionFactory.OpenSession(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/App.config b/src/NHibernate.Test/App.config index 83a2785b7d4..9d77dbe89e1 100644 --- a/src/NHibernate.Test/App.config +++ b/src/NHibernate.Test/App.config @@ -30,7 +30,7 @@ NHibernate.Dialect.MsSql2008Dialect - NHibernate.Driver.SqlClientDriver + NHibernate.Driver.Sql2008ClientDriver TestConnectionString NHibernate.Test.DebugConnectionProvider, NHibernate.Test ReadCommitted diff --git a/src/NHibernate.Test/Async/FilterTest/DynamicFilterTest.cs b/src/NHibernate.Test/Async/FilterTest/DynamicFilterTest.cs index 481aa9898d5..8814d227e94 100644 --- a/src/NHibernate.Test/Async/FilterTest/DynamicFilterTest.cs +++ b/src/NHibernate.Test/Async/FilterTest/DynamicFilterTest.cs @@ -773,4 +773,4 @@ public void Dispose() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs b/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs index d2db0191934..90d885db753 100644 --- a/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs +++ b/src/NHibernate.Test/Async/Hql/Ast/LimitClauseFixture.cs @@ -10,7 +10,9 @@ using System.Linq; using NHibernate.Cfg; +using NHibernate.Driver; using NHibernate.Hql.Ast.ANTLR; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.Hql.Ast @@ -22,7 +24,8 @@ public class LimitClauseFixtureAsync : BaseFixture protected override bool AppliesTo(Dialect.Dialect dialect) { return dialect.SupportsVariableLimit - && !(Dialect is Dialect.MsSql2000Dialect && cfg.Properties[Environment.ConnectionDriver] == typeof(Driver.OdbcDriver).FullName); // don't know why, but these tests don't work on SQL Server using ODBC + && !(Dialect is Dialect.MsSql2000Dialect && // don't know why, but these tests don't work on SQL Server using ODBC + typeof(OdbcDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))); } protected override void OnSetUp() @@ -186,4 +189,4 @@ public async Task TakeWithParameterAsync() s.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs index 285a68ed21a..1e7ecd3c116 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH1144/Fixture.cs @@ -12,6 +12,7 @@ using NHibernate.AdoNet; using NHibernate.Cfg; using NHibernate.Driver; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1144 @@ -36,7 +37,7 @@ protected override void Configure(Configuration configuration) [Test] public async Task CanSaveInSingleBatchAsync() { - if (configuration.Properties[Environment.ConnectionDriver].Contains(typeof (OracleDataClientDriver).Name) == false) + if (!typeof(OracleDataClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))) { Assert.Ignore("Only applicable for Oracle Data Client driver"); } @@ -85,4 +86,4 @@ public async Task CanSaveInSingleBatchAsync() Assert.IsTrue(executedBatch); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs new file mode 100644 index 00000000000..dd26d362887 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2207/SampleTest.cs @@ -0,0 +1,107 @@ +//------------------------------------------------------------------------------ +// +// 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; +using NHibernate.Dialect; +using NHibernate.Driver; +using NHibernate.Engine; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.NH2207 +{ + using System.Threading.Tasks; + using System.Threading; + [TestFixture] + public class SampleTestAsync : BugTestCase + { + protected override bool AppliesTo(Dialect.Dialect dialect) + { + return dialect is MsSql2008Dialect; + } + + protected override bool AppliesTo(ISessionFactoryImplementor factory) + { + return factory.ConnectionProvider.Driver is Sql2008ClientDriver; + } + + [Test] + public async Task WithoutUseNHSqlDataProviderWorkProperlyAsync() + { + var createTable = "CREATE TABLE TryDate([Id] [int] IDENTITY(1,1) NOT NULL,[MyDate] [date] NOT NULL)"; + var dropTable = "DROP TABLE TryDate"; + var insertTable = "INSERT INTO TryDate([MyDate]) VALUES(@p0)"; + using(var sqlConnection = new System.Data.SqlClient.SqlConnection(cfg.Properties[Cfg.Environment.ConnectionString])) + { + await (sqlConnection.OpenAsync(CancellationToken.None)); + using (var tx = sqlConnection.BeginTransaction()) + { + var command = sqlConnection.CreateCommand(); + command.Transaction = tx; + command.CommandText = createTable; + await (command.ExecuteNonQueryAsync(CancellationToken.None)); + tx.Commit(); + } + + try + { + using (var tx = sqlConnection.BeginTransaction()) + { + var command = sqlConnection.CreateCommand(); + command.Transaction = tx; + command.CommandText = insertTable; + var dateParam = command.CreateParameter(); + dateParam.ParameterName = "@p0"; + dateParam.DbType = DbType.Date; + dateParam.SqlDbType = SqlDbType.Date; + dateParam.Value = DateTime.MinValue.Date; + command.Parameters.Add(dateParam); + await (command.ExecuteNonQueryAsync(CancellationToken.None)); + tx.Commit(); + } + } + finally + { + using (var tx = sqlConnection.BeginTransaction()) + { + var command = sqlConnection.CreateCommand(); + command.Transaction = tx; + command.CommandText = dropTable; + await (command.ExecuteNonQueryAsync(CancellationToken.None)); + tx.Commit(); + } + } + } + } + + [Test] + public async Task Dates_Before_1753_Should_Not_Insert_NullAsync() + { + object savedId; + var expectedStoredValue = DateTime.MinValue.Date.AddDays(1).Date; + using (ISession session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var concrete = new DomainClass{Date = expectedStoredValue.AddMinutes(90)}; + savedId = await (session.SaveAsync(concrete)); + await (tx.CommitAsync()); + } + + using (ISession session = OpenSession()) + using (var tx = session.BeginTransaction()) + { + var savedObj = await (session.GetAsync(savedId)); + Assert.That(savedObj.Date, Is.EqualTo(expectedStoredValue)); + await (session.DeleteAsync(savedObj)); + await (tx.CommitAsync()); + } + } + } +} diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs index 87762cf3627..61a8bf45526 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH3202/Fixture.cs @@ -13,6 +13,7 @@ using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3202 @@ -26,7 +27,7 @@ protected override void Configure(Configuration configuration) if (!(Dialect is MsSql2008Dialect)) Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect)."); - if (!Environment.ConnectionDriver.Contains("SqlClientDriver")) + if (!typeof(SqlClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))) Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used)."); cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName); diff --git a/src/NHibernate.Test/Async/TypesTest/DateTypeTest.cs b/src/NHibernate.Test/Async/TypesTest/DateTypeTest.cs new file mode 100644 index 00000000000..72ceadfc151 --- /dev/null +++ b/src/NHibernate.Test/Async/TypesTest/DateTypeTest.cs @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +// +// 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.Collections.Generic; +using NHibernate.Dialect; +using NHibernate.Type; +using NUnit.Framework; +using System; + +namespace NHibernate.Test.TypesTest +{ + using System.Threading.Tasks; + using System.Threading; + + [TestFixture] + public class DateTypeFixtureAsync : TypeFixtureBase + { + protected override string TypeName + { + get { return "Date"; } + } + + [Test] + public Task ReadWriteNormalAsync() + { + try + { + var expected = DateTime.Today; + + return ReadWriteAsync(expected); + } + catch (Exception ex) + { + return Task.FromException(ex); + } + } + + [Test] + public Task ReadWriteMinAsync() + { + try + { + var expected = Sfi.ConnectionProvider.Driver.MinDate; + + return ReadWriteAsync(expected); + } + catch (Exception ex) + { + return Task.FromException(ex); + } + } + + [Test] + public Task ReadWriteYear750Async() + { + try + { + var expected = new DateTime(750, 5, 13); + if (Sfi.ConnectionProvider.Driver.MinDate > expected) + { + Assert.Ignore($"The driver does not support dates below {Sfi.ConnectionProvider.Driver.MinDate:O}"); + } + return ReadWriteAsync(expected); + } + catch (Exception ex) + { + return Task.FromException(ex); + } + } + + private async Task ReadWriteAsync(DateTime expected, CancellationToken cancellationToken = default(CancellationToken)) + { + // Add an hour to check it is correctly ignored once read back from db. + var basic = new DateClass { DateValue = expected.AddHours(1) }; + object savedId; + using (var s = OpenSession()) + { + savedId = await (s.SaveAsync(basic, cancellationToken)); + await (s.FlushAsync(cancellationToken)); + } + using (var s = OpenSession()) + { + basic = await (s.GetAsync(savedId, cancellationToken)); + Assert.That(basic.DateValue, Is.EqualTo(expected)); + await (s.DeleteAsync(basic, cancellationToken)); + await (s.FlushAsync(cancellationToken)); + } + } + } +} diff --git a/src/NHibernate.Test/FilterTest/Category.cs b/src/NHibernate.Test/FilterTest/Category.cs index 13f3fb7ca3d..36597d66f48 100644 --- a/src/NHibernate.Test/FilterTest/Category.cs +++ b/src/NHibernate.Test/FilterTest/Category.cs @@ -7,8 +7,8 @@ public class Category { private long id; private String name; - private DateTime effectiveStartDate; - private DateTime effectiveEndDate; + private DateTime? effectiveStartDate; + private DateTime? effectiveEndDate; private ISet products; public Category() @@ -39,13 +39,13 @@ public virtual string Name set { name = value; } } - public virtual DateTime EffectiveStartDate + public virtual DateTime? EffectiveStartDate { get { return effectiveStartDate; } set { effectiveStartDate = value; } } - public virtual DateTime EffectiveEndDate + public virtual DateTime? EffectiveEndDate { get { return effectiveEndDate; } set { effectiveEndDate = value; } @@ -93,4 +93,4 @@ public override int GetHashCode() return result; } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/FilterTest/DynamicFilterTest.cs b/src/NHibernate.Test/FilterTest/DynamicFilterTest.cs index 5294d8251f5..43075b56c63 100644 --- a/src/NHibernate.Test/FilterTest/DynamicFilterTest.cs +++ b/src/NHibernate.Test/FilterTest/DynamicFilterTest.cs @@ -747,4 +747,4 @@ public void Dispose() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/FilterTest/Order.cs b/src/NHibernate.Test/FilterTest/Order.cs index f231bd26731..70fbf01e7d6 100644 --- a/src/NHibernate.Test/FilterTest/Order.cs +++ b/src/NHibernate.Test/FilterTest/Order.cs @@ -7,8 +7,8 @@ public class Order { private long id; private String region; - private DateTime placementDate; - private DateTime fulfillmentDate; + private DateTime? placementDate; + private DateTime? fulfillmentDate; private Salesperson salesperson; private String buyer; private IList lineItems = new List(); @@ -25,13 +25,13 @@ public virtual string Region set { region = value; } } - public virtual DateTime PlacementDate + public virtual DateTime? PlacementDate { get { return placementDate; } set { placementDate = value; } } - public virtual DateTime FulfillmentDate + public virtual DateTime? FulfillmentDate { get { return fulfillmentDate; } set { fulfillmentDate = value; } @@ -70,4 +70,4 @@ public virtual void RemoveLineItem(int sequence) LineItems.RemoveAt(sequence); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/FilterTest/Product.cs b/src/NHibernate.Test/FilterTest/Product.cs index 13ba63790dc..f165dd5e7a8 100644 --- a/src/NHibernate.Test/FilterTest/Product.cs +++ b/src/NHibernate.Test/FilterTest/Product.cs @@ -8,8 +8,8 @@ public class Product private long id; private string name; private int stockNumber; // int for ease of hashCode() impl - private DateTime effectiveStartDate; - private DateTime effectiveEndDate; + private DateTime? effectiveStartDate; + private DateTime? effectiveEndDate; private ISet orderLineItems; private ISet categories; @@ -51,13 +51,13 @@ public virtual int StockNumber set { stockNumber = value; } } - public virtual DateTime EffectiveStartDate + public virtual DateTime? EffectiveStartDate { get { return effectiveStartDate; } set { effectiveStartDate = value; } } - public virtual DateTime EffectiveEndDate + public virtual DateTime? EffectiveEndDate { get { return effectiveEndDate; } set { effectiveEndDate = value; } @@ -85,4 +85,4 @@ public override bool Equals(object obj) return obj is Product && (((Product) obj).stockNumber == this.stockNumber); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/FilterTest/Salesperson.cs b/src/NHibernate.Test/FilterTest/Salesperson.cs index ed34c718a58..fad89be167c 100644 --- a/src/NHibernate.Test/FilterTest/Salesperson.cs +++ b/src/NHibernate.Test/FilterTest/Salesperson.cs @@ -8,7 +8,7 @@ public class Salesperson private long id; private String name; private String region; - private DateTime hireDate; + private DateTime? hireDate; private Department department; private ISet orders = new HashSet(); @@ -30,7 +30,7 @@ public virtual string Region set { region = value; } } - public virtual DateTime HireDate + public virtual DateTime? HireDate { get { return hireDate; } set { hireDate = value; } @@ -48,4 +48,4 @@ public virtual ISet Orders set { orders = value; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs b/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs index 08b52f91aef..75e6a3f8d81 100644 --- a/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs +++ b/src/NHibernate.Test/Hql/Ast/LimitClauseFixture.cs @@ -1,6 +1,8 @@ using System.Linq; using NHibernate.Cfg; +using NHibernate.Driver; using NHibernate.Hql.Ast.ANTLR; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.Hql.Ast @@ -11,7 +13,8 @@ public class LimitClauseFixture : BaseFixture protected override bool AppliesTo(Dialect.Dialect dialect) { return dialect.SupportsVariableLimit - && !(Dialect is Dialect.MsSql2000Dialect && cfg.Properties[Environment.ConnectionDriver] == typeof(Driver.OdbcDriver).FullName); // don't know why, but these tests don't work on SQL Server using ODBC + && !(Dialect is Dialect.MsSql2000Dialect && // don't know why, but these tests don't work on SQL Server using ODBC + typeof(OdbcDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))); } protected override void OnSetUp() @@ -175,4 +178,4 @@ public void TakeWithParameter() s.Close(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/Hql/Ast/Mammal.cs b/src/NHibernate.Test/Hql/Ast/Mammal.cs index a8afd5b65d6..fe27193801f 100644 --- a/src/NHibernate.Test/Hql/Ast/Mammal.cs +++ b/src/NHibernate.Test/Hql/Ast/Mammal.cs @@ -5,7 +5,7 @@ namespace NHibernate.Test.Hql.Ast public class Mammal: Animal { private bool pregnant; - private DateTime birthdate; + private DateTime? birthdate; public virtual bool Pregnant { @@ -13,10 +13,10 @@ public virtual bool Pregnant set { pregnant = value; } } - public virtual DateTime Birthdate + public virtual DateTime? Birthdate { get { return birthdate; } set { birthdate = value; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/LinqBulkManipulation/Domain/Mammal.cs b/src/NHibernate.Test/LinqBulkManipulation/Domain/Mammal.cs index 3daf5057ac3..a07e515640b 100644 --- a/src/NHibernate.Test/LinqBulkManipulation/Domain/Mammal.cs +++ b/src/NHibernate.Test/LinqBulkManipulation/Domain/Mammal.cs @@ -5,7 +5,7 @@ namespace NHibernate.Test.LinqBulkManipulation.Domain public class Mammal: Animal { private bool pregnant; - private DateTime birthdate; + private DateTime? birthdate; public virtual bool Pregnant { @@ -13,10 +13,10 @@ public virtual bool Pregnant set { pregnant = value; } } - public virtual DateTime Birthdate + public virtual DateTime? Birthdate { get { return birthdate; } set { birthdate = value; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs index b2559787b04..d65ec9606ea 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH1144/Fixture.cs @@ -2,6 +2,7 @@ using NHibernate.AdoNet; using NHibernate.Cfg; using NHibernate.Driver; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH1144 @@ -25,7 +26,7 @@ protected override void Configure(Configuration configuration) [Test] public void CanSaveInSingleBatch() { - if (configuration.Properties[Environment.ConnectionDriver].Contains(typeof (OracleDataClientDriver).Name) == false) + if (!typeof(OracleDataClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))) { Assert.Ignore("Only applicable for Oracle Data Client driver"); } @@ -74,4 +75,4 @@ public void CanSaveInSingleBatch() Assert.IsTrue(executedBatch); } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs b/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs index 52a92c97ee2..c84162a1e75 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2207/SampleTest.cs @@ -1,16 +1,23 @@ using System; using System.Data; using NHibernate.Dialect; +using NHibernate.Driver; +using NHibernate.Engine; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH2207 { - [TestFixture, Ignore("Demostration of external issue")] + [TestFixture] public class SampleTest : BugTestCase { protected override bool AppliesTo(Dialect.Dialect dialect) { - return dialect as MsSql2008Dialect != null; + return dialect is MsSql2008Dialect; + } + + protected override bool AppliesTo(ISessionFactoryImplementor factory) + { + return factory.ConnectionProvider.Driver is Sql2008ClientDriver; } [Test] @@ -41,6 +48,7 @@ public void WithoutUseNHSqlDataProviderWorkProperly() var dateParam = command.CreateParameter(); dateParam.ParameterName = "@p0"; dateParam.DbType = DbType.Date; + dateParam.SqlDbType = SqlDbType.Date; dateParam.Value = DateTime.MinValue.Date; command.Parameters.Add(dateParam); command.ExecuteNonQuery(); @@ -56,10 +64,9 @@ public void WithoutUseNHSqlDataProviderWorkProperly() command.CommandText = dropTable; command.ExecuteNonQuery(); tx.Commit(); - } + } } } - } [Test] @@ -85,4 +92,4 @@ public void Dates_Before_1753_Should_Not_Insert_Null() } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs index 65297a02e07..8734c483c18 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH3202/Fixture.cs @@ -3,6 +3,7 @@ using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; +using NHibernate.Util; using NUnit.Framework; namespace NHibernate.Test.NHSpecificTest.NH3202 @@ -15,7 +16,7 @@ protected override void Configure(Configuration configuration) if (!(Dialect is MsSql2008Dialect)) Assert.Ignore("Test is for MS SQL Server dialect only (custom dialect)."); - if (!Environment.ConnectionDriver.Contains("SqlClientDriver")) + if (!typeof(SqlClientDriver).IsAssignableFrom(ReflectHelper.ClassForName(cfg.GetProperty(Environment.ConnectionDriver)))) Assert.Ignore("Test is for MS SQL Server driver only (custom driver is used)."); cfg.SetProperty(Environment.Dialect, typeof(OffsetStartsAtOneTestDialect).AssemblyQualifiedName); diff --git a/src/NHibernate.Test/Stateless/Naturalness.cs b/src/NHibernate.Test/Stateless/Naturalness.cs index b03a9277dd4..06eb0e14f52 100644 --- a/src/NHibernate.Test/Stateless/Naturalness.cs +++ b/src/NHibernate.Test/Stateless/Naturalness.cs @@ -18,7 +18,7 @@ public class Human : Animal { public virtual string Name { get; set; } public virtual string NickName { get; set; } - public virtual DateTime Birthdate { get; set; } + public virtual DateTime? Birthdate { get; set; } } public class Family where T: Animal @@ -34,4 +34,4 @@ public virtual ISet Childs set { childs = value; } } } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/TypesTest/DateTypeTest.cs b/src/NHibernate.Test/TypesTest/DateTypeTest.cs index 59cf3e5f16a..4fb566e2f18 100644 --- a/src/NHibernate.Test/TypesTest/DateTypeTest.cs +++ b/src/NHibernate.Test/TypesTest/DateTypeTest.cs @@ -9,22 +9,22 @@ namespace NHibernate.Test.TypesTest [TestFixture] public class DateTypeTest { - [Test] + [Test, Obsolete("Testing obsolete SetParameterValues")] public void WhenNoParameterThenDefaultValueIsBaseDateValue() { var dateType = new DateType(); Assert.That(dateType.DefaultValue, Is.EqualTo(DateType.BaseDateValue)); } - [Test] + [Test, Obsolete("Testing obsolete SetParameterValues")] public void WhenSetParameterThenDefaultValueIsParameterValue() { var dateType = new DateType(); - dateType.SetParameterValues(new Dictionary{{DateType.BaseValueParameterName, "0001/01/01"}}); + dateType.SetParameterValues(new Dictionary { { DateType.BaseValueParameterName, "0001/01/01" } }); Assert.That(dateType.DefaultValue, Is.EqualTo(DateTime.MinValue)); } - [Test] + [Test, Obsolete("Testing obsolete SetParameterValues")] public void WhenSetParameterNullThenNotThrow() { var dateType = new DateType(); @@ -32,6 +32,7 @@ public void WhenSetParameterNullThenNotThrow() } } + [TestFixture] public class DateTypeFixture : TypeFixtureBase { protected override string TypeName @@ -53,38 +54,44 @@ public void ShouldBeDateType() [Test] public void ReadWriteNormal() { - var expected = DateTime.Today.Date; + var expected = DateTime.Today; - var basic = new DateClass { DateValue = expected.AddHours(1) }; - object savedId; - using (ISession s = OpenSession()) - { - savedId = s.Save(basic); - s.Flush(); - } - using (ISession s = OpenSession()) + ReadWrite(expected); + } + + [Test] + public void ReadWriteMin() + { + var expected = Sfi.ConnectionProvider.Driver.MinDate; + + ReadWrite(expected); + } + + [Test] + public void ReadWriteYear750() + { + var expected = new DateTime(750, 5, 13); + if (Sfi.ConnectionProvider.Driver.MinDate > expected) { - basic = s.Get(savedId); - Assert.That(basic.DateValue, Is.EqualTo(expected)); - s.Delete(basic); - s.Flush(); + Assert.Ignore($"The driver does not support dates below {Sfi.ConnectionProvider.Driver.MinDate:O}"); } + ReadWrite(expected); } - [Test] - public void ReadWriteBaseValue() + private void ReadWrite(DateTime expected) { - var basic = new DateClass { DateValue = new DateTime(1899,1,1) }; + // Add an hour to check it is correctly ignored once read back from db. + var basic = new DateClass { DateValue = expected.AddHours(1) }; object savedId; - using (ISession s = OpenSession()) + using (var s = OpenSession()) { - savedId = s.Save(basic); + savedId = s.Save(basic); s.Flush(); } - using (ISession s = OpenSession()) + using (var s = OpenSession()) { basic = s.Get(savedId); - Assert.That(basic.DateValue.HasValue, Is.False); + Assert.That(basic.DateValue, Is.EqualTo(expected)); s.Delete(basic); s.Flush(); } diff --git a/src/NHibernate.TestDatabaseSetup/App.config b/src/NHibernate.TestDatabaseSetup/App.config index 12027f3e8e8..1fa471187b0 100644 --- a/src/NHibernate.TestDatabaseSetup/App.config +++ b/src/NHibernate.TestDatabaseSetup/App.config @@ -2,13 +2,13 @@
+ type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /> - NHibernate.Driver.SqlClientDriver - + NHibernate.Driver.Sql2008ClientDriver + Server=.\SQLExpress;initial catalog=master;Integrated Security=SSPI diff --git a/src/NHibernate/Driver/DriverBase.cs b/src/NHibernate/Driver/DriverBase.cs index 750662d3f1a..46601c7b916 100644 --- a/src/NHibernate/Driver/DriverBase.cs +++ b/src/NHibernate/Driver/DriverBase.cs @@ -321,5 +321,8 @@ public DbParameter GenerateOutputParameter(DbCommand command) public virtual bool SupportsEnlistmentWhenAutoEnlistmentIsDisabled => true; public virtual bool HasDelayedDistributedTransactionCompletion => false; + + /// + public virtual DateTime MinDate => DateTime.MinValue; } -} \ No newline at end of file +} diff --git a/src/NHibernate/Driver/IDriver.cs b/src/NHibernate/Driver/IDriver.cs index 4a09d5a5fbf..6420d052fdd 100644 --- a/src/NHibernate/Driver/IDriver.cs +++ b/src/NHibernate/Driver/IDriver.cs @@ -158,5 +158,10 @@ public interface IDriver /// crash due to this, because they re-use the connection in the second phase. /// bool HasDelayedDistributedTransactionCompletion { get; } + + /// + /// The minimal date supplied as a supported by this driver. + /// + DateTime MinDate { get; } } -} \ No newline at end of file +} diff --git a/src/NHibernate/Driver/MySqlDataDriver.cs b/src/NHibernate/Driver/MySqlDataDriver.cs index 8dd2aee0dff..83e9702cfef 100644 --- a/src/NHibernate/Driver/MySqlDataDriver.cs +++ b/src/NHibernate/Driver/MySqlDataDriver.cs @@ -90,5 +90,10 @@ public override bool SupportsMultipleQueries } public override bool RequiresTimeSpanForTime => true; + + // As of v5.7, lower dates may "work" but without guarantees. + // https://dev.mysql.com/doc/refman/5.7/en/datetime.html + /// + public override DateTime MinDate => new DateTime(1000, 1, 1); } } diff --git a/src/NHibernate/Driver/OdbcDriver.cs b/src/NHibernate/Driver/OdbcDriver.cs index eb875fe0eda..0922822754f 100644 --- a/src/NHibernate/Driver/OdbcDriver.cs +++ b/src/NHibernate/Driver/OdbcDriver.cs @@ -89,5 +89,8 @@ protected override void InitializeParameter(DbParameter dbParam, string name, Sq /// Depends on target DB in the Odbc case. This in facts depends on both the driver and the database. /// public override bool HasDelayedDistributedTransactionCompletion => true; + + /// + public override DateTime MinDate => new DateTime(1753, 1, 1); } } diff --git a/src/NHibernate/Driver/Sql2008ClientDriver.cs b/src/NHibernate/Driver/Sql2008ClientDriver.cs index f5dd560ad6d..90912bb234d 100644 --- a/src/NHibernate/Driver/Sql2008ClientDriver.cs +++ b/src/NHibernate/Driver/Sql2008ClientDriver.cs @@ -11,12 +11,20 @@ public class Sql2008ClientDriver : SqlClientDriver protected override void InitializeParameter(DbParameter dbParam, string name, SqlTypes.SqlType sqlType) { base.InitializeParameter(dbParam, name, sqlType); - if (sqlType.DbType == DbType.Time) + switch (sqlType.DbType) { - ((SqlParameter) dbParam).SqlDbType = SqlDbType.Time; + case DbType.Time: + ((SqlParameter) dbParam).SqlDbType = SqlDbType.Time; + break; + case DbType.Date: + ((SqlParameter) dbParam).SqlDbType = SqlDbType.Date; + break; } } public override bool RequiresTimeSpanForTime => true; + + /// + public override DateTime MinDate => DateTime.MinValue; } -} \ No newline at end of file +} diff --git a/src/NHibernate/Driver/SqlClientDriver.cs b/src/NHibernate/Driver/SqlClientDriver.cs index 945723a1ac0..8a01a2f03db 100644 --- a/src/NHibernate/Driver/SqlClientDriver.cs +++ b/src/NHibernate/Driver/SqlClientDriver.cs @@ -1,8 +1,8 @@ +using System; using System.Data; using System.Data.Common; using System.Data.SqlClient; using NHibernate.AdoNet; -using NHibernate.Dialect; using NHibernate.Engine; using NHibernate.SqlTypes; @@ -207,5 +207,8 @@ public override bool SupportsMultipleQueries /// right after the scope disposal. /// public override bool HasDelayedDistributedTransactionCompletion => true; + + /// + public override DateTime MinDate => new DateTime(1753, 1, 1); } } diff --git a/src/NHibernate/Driver/SqlServerCeDriver.cs b/src/NHibernate/Driver/SqlServerCeDriver.cs index 188e2bb229b..ad18982dd25 100644 --- a/src/NHibernate/Driver/SqlServerCeDriver.cs +++ b/src/NHibernate/Driver/SqlServerCeDriver.cs @@ -145,5 +145,8 @@ private void AdjustDbParamTypeForLargeObjects(DbParameter dbParam, SqlType sqlTy /// this case. /// public override bool SupportsEnlistmentWhenAutoEnlistmentIsDisabled => false; + + /// + public override DateTime MinDate => new DateTime(1753, 1, 1); } -} \ No newline at end of file +} diff --git a/src/NHibernate/Type/DateType.cs b/src/NHibernate/Type/DateType.cs index 03a9c315dd2..f0178857978 100644 --- a/src/NHibernate/Type/DateType.cs +++ b/src/NHibernate/Type/DateType.cs @@ -15,9 +15,16 @@ namespace NHibernate.Type [Serializable] public class DateType : PrimitiveType, IIdentifierType, ILiteralType, IParameterizedType { + private static readonly IInternalLogger _log = LoggerProvider.LoggerFor(typeof(DateType)); + // Since v5.0 + [Obsolete("Explicitly affect your values to your entities properties instead.")] public const string BaseValueParameterName = "BaseValue"; - public static readonly DateTime BaseDateValue = new DateTime(1753, 01, 01); - private DateTime customBaseDate = BaseDateValue; + // Since v5.0 + [Obsolete("Use DateTime.MinValue.")] + public static readonly DateTime BaseDateValue = _baseDateValue; + private DateTime customBaseDate = _baseDateValue; + + private static readonly DateTime _baseDateValue = DateTime.MinValue; /// public DateType() : base(SqlTypeFactory.Date) @@ -57,8 +64,7 @@ public override void Set(DbCommand st, object value, int index, ISessionImplemen { var parm = st.Parameters[index]; var dateTime = (DateTime)value; - if (dateTime < customBaseDate) parm.Value = DBNull.Value; - else parm.Value = dateTime.Date; + parm.Value = dateTime.Date; } public override bool IsEqual(object x, object y) @@ -125,6 +131,8 @@ public override string ObjectToSQLString(object value, Dialect.Dialect dialect) return "\'" + ((DateTime)value).ToShortDateString() + "\'"; } + // Since v5 + [Obsolete("Its only parameter, BaseValue, is obsolete.")] public void SetParameterValues(IDictionary parameters) { if(parameters == null) @@ -134,8 +142,11 @@ public void SetParameterValues(IDictionary parameters) string value; if (parameters.TryGetValue(BaseValueParameterName, out value)) { + _log.WarnFormat( + "Parameter {0} is obsolete and will be remove in a future version. Explicitly affect your values to your entities properties instead.", + BaseValueParameterName); customBaseDate = DateTime.Parse(value); } } } -} \ No newline at end of file +}