public void datetime_tests__can_use_datetime2()
        {
            var dbFactory = new OrmLiteConnectionFactory(base.ConnectionString, SqlServerOrmLiteDialectProvider.Instance);

            //change to datetime2 - check for higher range and precision
            (SqlServerOrmLiteDialectProvider.Instance as SqlServerOrmLiteDialectProvider).UseDatetime2(true);

            using (var conn = dbFactory.OpenDbConnection()) {
                var test_object_ValidForDatetime2      = Table_for_datetime2_tests.get_test_object_ValidForDatetime2();
                var test_object_ValidForNormalDatetime = Table_for_datetime2_tests.get_test_object_ValidForNormalDatetime();

                conn.CreateTable <Table_for_datetime2_tests>(true);

                //normal insert
                conn.Insert(test_object_ValidForDatetime2);
                var insertedId = (int)conn.GetLastInsertId();

                //read back, and verify precision
                var fromDb = conn.GetById <Table_for_datetime2_tests>(insertedId);
                Assert.AreEqual(test_object_ValidForDatetime2.ToVerifyPrecision, fromDb.ToVerifyPrecision);

                //update
                fromDb.ToVerifyPrecision = test_object_ValidForDatetime2.ToVerifyPrecision.Value.AddYears(1);
                conn.UpdateParam(fromDb);
                var fromDb2 = conn.GetById <Table_for_datetime2_tests>(insertedId);
                Assert.AreEqual(test_object_ValidForDatetime2.ToVerifyPrecision.Value.AddYears(1), fromDb2.ToVerifyPrecision);


                //check InsertParam
                conn.InsertParam(test_object_ValidForDatetime2);
            }
        }
        public void datetime_tests__can_use_datetime2()
        {
            var dbFactory = new OrmLiteConnectionFactory(base.ConnectionString, SqlServerOrmLiteDialectProvider.Instance);

            //change to datetime2 - check for higher range and precision
            //SqlServerOrmLiteDialectProvider.Instance.UseDatetime2(true);
            SqlServerDialect.Provider.RegisterConverter <DateTime>(new SqlServerDateTime2Converter());

            using (var conn = dbFactory.OpenDbConnection()) {
                var test_object_ValidForDatetime2 = Table_for_datetime2_tests.get_test_object_ValidForDatetime2();

                conn.CreateTable <Table_for_datetime2_tests>(true);

                //normal insert
                var insertedId = conn.Insert(test_object_ValidForDatetime2, selectIdentity: true);

                //read back, and verify precision
                var fromDb = conn.SingleById <Table_for_datetime2_tests>(insertedId);
                Assert.AreEqual(test_object_ValidForDatetime2.ToVerifyPrecision, fromDb.ToVerifyPrecision);

                //update
                fromDb.ToVerifyPrecision = test_object_ValidForDatetime2.ToVerifyPrecision.Value.AddYears(1);
                conn.Update(fromDb);
                var fromDb2 = conn.SingleById <Table_for_datetime2_tests>(insertedId);
                Assert.AreEqual(test_object_ValidForDatetime2.ToVerifyPrecision.Value.AddYears(1), fromDb2.ToVerifyPrecision);

                //check InsertParam
                conn.Insert(test_object_ValidForDatetime2);

                //check select on datetime2 value
                var result = conn.Select <Table_for_datetime2_tests>(t => t.ToVerifyPrecision == test_object_ValidForDatetime2.ToVerifyPrecision);
                Assert.AreEqual(result.Single().ToVerifyPrecision, test_object_ValidForDatetime2.ToVerifyPrecision);
            }
        }
        public void datetime_tests__check_default_behaviour()
        {
            var dbFactory = new OrmLiteConnectionFactory(base.ConnectionString, SqlServerOrmLiteDialectProvider.Instance);

            //default behaviour: normal datetime can't hold DateTime values of year 1.
            (SqlServerOrmLiteDialectProvider.Instance as SqlServerOrmLiteDialectProvider).UseDatetime2(false);

            using (var conn = dbFactory.OpenDbConnection()) {
                var test_object_ValidForDatetime2      = Table_for_datetime2_tests.get_test_object_ValidForDatetime2();
                var test_object_ValidForNormalDatetime = Table_for_datetime2_tests.get_test_object_ValidForNormalDatetime();

                conn.CreateTable <Table_for_datetime2_tests>(true);

                //normal insert
                var insertedId = conn.Insert(test_object_ValidForNormalDatetime, selectIdentity: true);

                //insert works, but can't regular datetime's precision is not great enough.
                var fromDb = conn.SingleById <Table_for_datetime2_tests>(insertedId);
                Assert.AreNotEqual(test_object_ValidForNormalDatetime.ToVerifyPrecision, fromDb.ToVerifyPrecision);

                var thrown = Assert.Throws <SqlTypeException>(() => {
                    conn.Insert(test_object_ValidForDatetime2);
                });
                Assert.That(thrown.Message.Contains("SqlDateTime overflow"));


                //check InsertParam
                conn.Insert(test_object_ValidForNormalDatetime);
                //InsertParam fails differently:
                var insertParamException = Assert.Throws <System.Data.SqlTypes.SqlTypeException>(() => {
                    conn.Insert(test_object_ValidForDatetime2);
                });
                Assert.That(insertParamException.Message.Contains("SqlDateTime overflow"));
            }
        }