diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MapType/DateTimeOffSetTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MapType/DateTimeOffSetTest.cs index 91fb979a..8131e69c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MapType/DateTimeOffSetTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MapType/DateTimeOffSetTest.cs @@ -1,4 +1,5 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; +using MySqlConnector; using System; using System.Numerics; using Xunit; @@ -19,11 +20,17 @@ namespace FreeSql.Tests.MySqlConnectorMapType [Fact] public void DateTimeToDateTimeOffSet() { + + //MySqlDateTime dt1 = new MySqlDateTime(DateTime.Now); + //System.Convert.ChangeType(dt1, typeof(DateTimeOffset)); // System.Exception : Specified cast is not valid. + + //insert var orm = g.mysql; + orm.Delete().Where(a => true).ExecuteAffrows(); var item = new DateTimeOffSetTestMap { dtos_to_dt = DateTimeOffset.Now, dtosnullable_to_dt = DateTimeOffset.Now }; Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - var find = orm.Select().Where(a => a.id == item.id).First(); + var find = orm.Select().Where(a => a.id == item.id).First(); // System.Exception : Specified cast is not valid. Assert.NotNull(find); Assert.Equal(item.id, find.id); Assert.Equal(item.dtos_to_dt.ToString("g"), find.dtos_to_dt.ToString("g")); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs index 7299ceec..7ded92e8 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs @@ -15,14 +15,13 @@ namespace FreeSql.Tests.MySql public void InsertOrUpdate_OnePrimary() { fsql.Delete().Where("1=1").ExecuteAffrows(); - var iou = fsql.InsertOrUpdate().SetSource(fsql.Select().ToSql(a => new { id = a.id + 1, name = "xxx" }, FieldAliasOptions.AsProperty)); + var iou = fsql.InsertOrUpdate().SetSource(fsql.Select().ToSql(a => new { id = a.id + 1, name = "'xxx'" }, FieldAliasOptions.AsProperty)); var sql = iou.ToSql(); Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) -SELECT (a.`id` + 1) `id`, xxx `name` +SELECT (a.`id` + 1) `id`, 'xxx' `name` FROM `tbiou022` a ON DUPLICATE KEY UPDATE `name` = VALUES(`name`)", sql); - Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" }); sql = iou.ToSql(); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs index 1e951e68..6704714b 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs @@ -11,7 +11,7 @@ namespace FreeSql.Tests.PostgreSQL IInsert insert => g.pgsql.Insert(); - [Table(Name = "tb_topic_insert")] + [Table(Name = "tb_topic_insert2")] class Topic { [Column(IsIdentity = true, IsPrimary = true)] @@ -137,21 +137,33 @@ namespace FreeSql.Tests.PostgreSQL insert.AppendData(items.First()).ExecuteInserted(); } + + [Table(Name = "tb_topic_insert_pgcopy")] + class TopicPgCopy + { + [Column(IsIdentity = true, IsPrimary = true)] + public int Id { get; set; } + public int Clicks { get; set; } + public TestTypeInfo Type { get; set; } + public string Title { get; set; } + public DateTime CreateTime { get; set; } + } + [Fact] public void ExecutePgCopy() { - var maxId = g.pgsql.Select().Max(a => a.Id); - var items = new List(); - for (var a = 0; a < 10; a++) items.Add(new Topic { Id = maxId + a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + var maxId = g.pgsql.Select().Max(a => a.Id); + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new TopicPgCopy { Id = maxId + a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); - insert.AppendData(items).InsertIdentity().ExecutePgCopy(); + g.pgsql.Insert(items).InsertIdentity().ExecutePgCopy(); - items = g.pgsql.Select().OrderByDescending(a => a.Id).Limit(1000).ToList(); + items = g.pgsql.Select().OrderByDescending(a => a.Id).Limit(1000).ToList(); var sql = g.pgsql.Insert(items).InsertIdentity().NoneParameter().ToSql(); - g.pgsql.Update().SetSource(items).ExecutePgCopy(); - g.pgsql.Update().SetSource(items, a => new { a.Id, a.Clicks }).ExecutePgCopy(); - g.pgsql.Update().SetSource(items).UpdateColumns(a => new { a.Title }).ExecutePgCopy(); - g.pgsql.Update().SetSource(items, a => new { a.Id, a.Clicks }).UpdateColumns(a => new { a.Title }).ExecutePgCopy(); + g.pgsql.Update().SetSource(items).ExecutePgCopy(); + g.pgsql.Update().SetSource(items, a => new { a.Id, a.Clicks }).ExecutePgCopy(); + g.pgsql.Update().SetSource(items).UpdateColumns(a => new { a.Title }).ExecutePgCopy(); + g.pgsql.Update().SetSource(items, a => new { a.Id, a.Clicks }).UpdateColumns(a => new { a.Title }).ExecutePgCopy(); } [Fact] diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 2f2b3f27..afe2ce8e 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1546,6 +1546,13 @@ namespace FreeSql.Internal case DataType.GBase: if (dr.IsDBNull(index)) return null; break; + case DataType.MySql: + if (dr.GetFieldType(index).FullName == "MySqlConnector.MySqlDateTime") + { + if (dr.IsDBNull(index)) return null; + return dr.GetDateTime(index); + } + break; } return dr.GetValue(index); } diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index f1ed6f12..42cdb1cc 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -36,6 +36,7 @@ namespace FreeSql.MySql }); Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValue[typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); } public override ISelect CreateSelectProvider(object dywhere) => new MySqlSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);