diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 9aa30d74..ba2c84c6 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -141,6 +141,22 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sqss = fsql.Insert(dic).AsTable("table1").ToSql(); + var sqss2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + sqss = fsql.Insert(dic).AsTable("table1").NoneParameter(false).ToSql(); + sqss2 = fsql.Insert(diclist).AsTable("table1").NoneParameter(false).ToSql(); + for (var a = 0; a < 10000; a++) fsql.Select().First(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 981b74bf..9ca04063 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -5,7 +5,7 @@ 3.2.100 true FreeSql;ncc;YeXiangQin - FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 翰高, And Access + FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 南大通用, 翰高, And Access https://github.com/2881099/FreeSql/wiki/DbContext FreeSql ORM DbContext git diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index f2fb80ad..7992fa1f 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -4,7 +4,7 @@ netstandard2.0;net60;net50;netcoreapp31;netcoreapp21;net45;net40 3.2.100 FreeSql;ncc;YeXiangQin - FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/翰高/Access, and read/write separation、and split table. + FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/南大通用/翰高/Access, and read/write separation、and split table. https://github.com/2881099/FreeSql/wiki/Repository FreeSql ORM Repository true diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertTest.cs index 48c9376e..9df9421f 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertTest.cs @@ -29,6 +29,31 @@ namespace FreeSql.Tests.MySqlConnector } enum TestEnumInserTbType { str1, biggit, sum211 } + [Fact] + public void InsertDictionary() + { + var fsql = g.mysql; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(@id_0, @name_0), (@id_1, @name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(1, 'xxxx'), (2, 'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs index 3929e55d..6ea7883b 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs @@ -22,6 +22,37 @@ namespace FreeSql.Tests.Dameng public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.dameng; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_0, :name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT ALL +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_0, :name_0) +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_1, :name_1) + SELECT 1 FROM DUAL", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT ALL +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx') +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(2, 'yyyy') + SELECT 1 FROM DUAL", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs index 1d7d3161..f4ff5666 100644 --- a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs @@ -22,6 +22,35 @@ namespace FreeSql.Tests.Firebird public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.firebird; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") SELECT FIRST 1 @id_0, @name_0 FROM rdb$database +UNION ALL + SELECT FIRST 1 @id_1, @name_1 FROM rdb$database", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") SELECT FIRST 1 1, 'xxxx' FROM rdb$database +UNION ALL + SELECT FIRST 1 2, 'yyyy' FROM rdb$database", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs index 3e8fcf0e..50652b86 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs @@ -22,6 +22,27 @@ namespace FreeSql.Tests.MsAccess public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.msaccess; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(1, 'xxxx')", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(1, 'xxxx'), (2, 'yyyy')", sql2); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs index ff75484b..db55bc8b 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertTest.cs @@ -30,6 +30,31 @@ namespace FreeSql.Tests.MySql } enum TestEnumInserTbType { str1, biggit, sum211 } + [Fact] + public void InsertDictionary() + { + var fsql = g.mysql; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(?id_0, ?name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(?id_0, ?name_0), (?id_1, ?name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO `table1`(`id`, `name`) VALUES(1, 'xxxx'), (2, 'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleInsertTest.cs index 4c627ad7..77392883 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleInsertTest.cs @@ -22,6 +22,37 @@ namespace FreeSql.Tests.Oracle public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.oracle; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_0, :name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT ALL +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_0, :name_0) +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(:id_1, :name_1) + SELECT 1 FROM DUAL", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT ALL +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx') +INTO ""TABLE1""(""ID"", ""NAME"") VALUES(2, 'yyyy') + SELECT 1 FROM DUAL", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs index 0803513d..b3f6831a 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertTest.cs @@ -22,6 +22,31 @@ namespace FreeSql.Tests.PostgreSQL public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.pgsql; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(@id_0, @name_0), (@id_1, @name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(1, 'xxxx'), (2, 'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongInsertTest.cs index e771cee9..072ecbbf 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/Curd/ShenTongInsertTest.cs @@ -22,6 +22,31 @@ namespace FreeSql.Tests.ShenTong public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.shentong; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(@id_0, @name_0), (@id_1, @name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""TABLE1""(""ID"", ""NAME"") VALUES(1, 'xxxx'), (2, 'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs index 7122c4fe..b9a98052 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertTest.cs @@ -32,6 +32,31 @@ namespace FreeSql.Tests.SqlServer public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.sqlserver; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(@id_0, @name_0), (@id_1, @name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(1, N'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO [table1]([id], [name]) VALUES(1, N'xxxx'), (2, N'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertTest.cs index d3579aa0..46321dcd 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertTest.cs @@ -22,6 +22,31 @@ namespace FreeSql.Tests.Sqlite public DateTime CreateTime { get; set; } } + [Fact] + public void InsertDictionary() + { + var fsql = g.sqlite; + Dictionary dic = new Dictionary(); + dic.Add("id", 1); + dic.Add("name", "xxxx"); + var diclist = new List>(); + diclist.Add(dic); + diclist.Add(new Dictionary + { + ["id"] = 2, + ["name"] = "yyyy" + }); + + var sql1 = fsql.Insert(dic).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(@id_0, @name_0)", sql1); + var sql2 = fsql.Insert(diclist).AsTable("table1").ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(@id_0, @name_0), (@id_1, @name_1)", sql2); + var sql3 = fsql.Insert(dic).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(1, 'xxxx')", sql3); + var sql4 = fsql.Insert(diclist).AsTable("table1").NoneParameter().ToSql(); + Assert.Equal(@"INSERT INTO ""table1""(""id"", ""name"") VALUES(1, 'xxxx'), (2, 'yyyy')", sql4); + } + [Fact] public void AppendData() { diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 88f1752c..d6931e13 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -5,7 +5,7 @@ 3.2.100 true FreeSql;ncc;YeXiangQin - FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 翰高, And Access + FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 南大通用, 翰高, And Access https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql git diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 7c59a530..63908a16 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1629,6 +1629,13 @@ + + + 设置表名 + + + + 动态Type,在使用 Insert<object> 后使用本方法,指定实体类型 diff --git a/FreeSql/Interface/Curd/IInsert.cs b/FreeSql/Interface/Curd/IInsert.cs index 4cbcfd8c..30daa129 100644 --- a/FreeSql/Interface/Curd/IInsert.cs +++ b/FreeSql/Interface/Curd/IInsert.cs @@ -119,6 +119,12 @@ namespace FreeSql /// IInsert AsTable(Func tableRule); /// + /// 设置表名 + /// + /// + /// + IInsert AsTable(string tableName); + /// /// 动态Type,在使用 Insert<object> 后使用本方法,指定实体类型 /// /// diff --git a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs index 30cec779..b0fe1e4b 100644 --- a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs +++ b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs @@ -94,7 +94,7 @@ namespace FreeSql.Internal.CommonProvider protected void SyncStructure(params TypeAndName[] objects) { if (objects == null) return; - var syncObjects = objects.Where(a => a.entityType != typeof(object) && _dicSycedGetOrAdd(a.entityType).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false && GetTableByEntity(a.entityType)?.DisableSyncStructure == false) + var syncObjects = objects.Where(a => a.entityType != null && a.entityType != typeof(object) && _dicSycedGetOrAdd(a.entityType).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false && GetTableByEntity(a.entityType)?.DisableSyncStructure == false) .Select(a => new TypeAndName(a.entityType, GetTableNameLowerOrUpper(a.tableName))).ToArray(); if (syncObjects.Any() == false) return; var before = new Aop.SyncStructureBeforeEventArgs(syncObjects.Select(a => a.entityType).ToArray()); diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 21254fc0..76a9b1db 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -9,6 +9,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using System.Collections; namespace FreeSql.Internal.CommonProvider { @@ -115,6 +116,7 @@ namespace FreeSql.Internal.CommonProvider { if (source != null) { + GetDictionaryTableInfo(source, _orm, ref _table); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); _source.Add(source); } @@ -124,6 +126,7 @@ namespace FreeSql.Internal.CommonProvider { if (source != null) { + GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); _source.AddRange(source); } @@ -134,12 +137,49 @@ namespace FreeSql.Internal.CommonProvider if (source != null) { source = source.Where(a => a != null).ToList(); + GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); _source.AddRange(source); } return this; } + public static void GetDictionaryTableInfo(T1 source, IFreeSql orm, ref TableInfo table) + { + if (table == null && typeof(T1) == typeof(Dictionary)) + { + var dic = source as Dictionary; + table = new TableInfo(); + table.Type = typeof(Dictionary); + table.CsName = dic.TryGetValue("", out var tryval) ? string.Concat(tryval) : ""; + table.DbName = table.CsName; + table.DisableSyncStructure = true; + table.IsDictionaryType = true; + var colpos = new List(); + foreach (var kv in dic) + { + var colName = kv.Key; + if (orm.CodeFirst.IsSyncStructureToLower) colName = colName.ToLower(); + if (orm.CodeFirst.IsSyncStructureToUpper) colName = colName.ToUpper(); + var col = new ColumnInfo + { + CsName = kv.Key, + Table = table, + Attribute = new DataAnnotations.ColumnAttribute + { + Name = colName, + MapType = typeof(object) + }, + CsType = typeof(object) + }; + table.Columns.Add(colName, col); + table.ColumnsByCs.Add(kv.Key, col); + colpos.Add(col); + } + table.ColumnsByPosition = colpos.ToArray(); + colpos.Clear(); + } + } public static void AuditDataValue(object sender, IEnumerable data, IFreeSql orm, TableInfo table, Dictionary changedDict) { if (data?.Any() != true) return; @@ -148,7 +188,7 @@ namespace FreeSql.Internal.CommonProvider } public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table, Dictionary changedDict) { - if (data == null) return; + if (data == null || table == null) return; if (typeof(T1) == typeof(object) && new[] { table.Type, table.TypeLazy }.Contains(data.GetType()) == false) throw new Exception($"操作的数据类型({data.GetType().DisplayCsharp()}) 与 AsType({table.Type.DisplayCsharp()}) 不一致,请检查。"); foreach (var col in table.Columns.Values) @@ -505,13 +545,14 @@ namespace FreeSql.Internal.CommonProvider protected string TableRuleInvoke() { - if (_tableRule == null) return _table.DbName; - var newname = _tableRule(_table.DbName); - if (newname == _table.DbName) return _table.DbName; - if (string.IsNullOrEmpty(newname)) return _table.DbName; + var tbname = _table?.DbName ?? ""; + if (_tableRule == null) return tbname; + var newname = _tableRule(tbname); + if (newname == tbname) return tbname; + if (string.IsNullOrEmpty(newname)) return tbname; if (_orm.CodeFirst.IsSyncStructureToLower) newname = newname.ToLower(); if (_orm.CodeFirst.IsSyncStructureToUpper) newname = newname.ToUpper(); - if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(_table.Type, newname); + if (_orm.CodeFirst.IsAutoSyncStructure) _orm.CodeFirst.SyncStructure(_table?.Type, newname); return newname; } public IInsert AsTable(Func tableRule) @@ -519,6 +560,11 @@ namespace FreeSql.Internal.CommonProvider _tableRule = tableRule; return this; } + public IInsert AsTable(string tableName) + { + _tableRule = (oldname) => tableName; + return this; + } public IInsert AsType(Type entityType) { if (entityType == typeof(object)) throw new Exception("IInsert.AsType 参数不支持指定为 object"); diff --git a/FreeSql/Internal/Model/ColumnInfo.cs b/FreeSql/Internal/Model/ColumnInfo.cs index ef69fcc6..9a175b7b 100644 --- a/FreeSql/Internal/Model/ColumnInfo.cs +++ b/FreeSql/Internal/Model/ColumnInfo.cs @@ -31,6 +31,7 @@ namespace FreeSql.Internal.Model /// public object GetDbValue(object obj) { + if (Table.IsDictionaryType) return (obj as Dictionary)?.TryGetValue(CsName, out var tryval) == true ? tryval : null; var dbval = Table.GetPropertyValue(obj, CsName); //if (ConversionCsToDb != null) dbval = ConversionCsToDb(dbval); if (Attribute.MapType != CsType) dbval = Utils.GetDataReaderValue(Attribute.MapType, dbval); @@ -40,7 +41,11 @@ namespace FreeSql.Internal.Model /// 获取 obj.CsName 属性原始值(不经过 MapType) /// /// - public object GetValue(object obj) => Table.GetPropertyValue(obj, CsName); + public object GetValue(object obj) + { + if (Table.IsDictionaryType) return (obj as Dictionary)?.TryGetValue(CsName, out var tryval) == true ? tryval : null; + return Table.GetPropertyValue(obj, CsName); + } /// /// 设置 obj.CsName 属性值 /// diff --git a/FreeSql/Internal/Model/TableInfo.cs b/FreeSql/Internal/Model/TableInfo.cs index 44088248..4058a626 100644 --- a/FreeSql/Internal/Model/TableInfo.cs +++ b/FreeSql/Internal/Model/TableInfo.cs @@ -25,6 +25,7 @@ namespace FreeSql.Internal.Model public bool DisableSyncStructure { get; set; } public string Comment { get; internal set; } public bool IsRereadSql { get; internal set; } + public bool IsDictionaryType { get; internal set; } public ColumnInfo VersionColumn { get; set; } diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseDbFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseDbFirst.cs index bbb44fff..5c1b9da8 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseDbFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseDbFirst.cs @@ -31,7 +31,7 @@ namespace FreeSql.ClickHouse column.DbTypeText = column.DbTypeTextFull; //(?<=\()(\S +)(?=\)) } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "bit": case "tinyint": @@ -86,7 +86,7 @@ namespace FreeSql.ClickHouse case "varchar": return DbType.String; default: { - if (column.DbTypeText.ToLower().Contains("datetime")) + if (column.DbTypeText?.ToLower().Contains("datetime") == true) return DbType.DateTime; return DbType.String; } diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs index e343a8b5..6d81e48b 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs @@ -20,8 +20,8 @@ namespace FreeSql.ClickHouse public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; - DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType = dbtype, Value = value };//QuoteParamterName(parameterName) + var dbtype = (DbType?)_orm.CodeFirst.GetDbInfo(type)?.type; + DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType = dbtype ?? default, Value = value };//QuoteParamterName(parameterName) if (col != null) { var dbtype2 = (DbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); @@ -40,8 +40,6 @@ namespace FreeSql.ClickHouse ret.Value = (bool)value ? 1 : 0; } } - - ret.DbType = dbtype; _params?.Add(ret); return ret; } @@ -52,9 +50,7 @@ namespace FreeSql.ClickHouse DbParameter ret = new ClickHouseDbParameter { ParameterName = $"?{name}", Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; if (tp != null) - { ret.DbType = (DbType)tp.Value; - } return ret; }); @@ -64,13 +60,9 @@ namespace FreeSql.ClickHouse if (string.IsNullOrWhiteSpace(col?.Attribute.RewriteSql) == false) return string.Format(col.Attribute.RewriteSql, sql); if (Regex.IsMatch(sql, @"\{\{[\w\d]+_+\d:\{\d\}\}\}")) - { return string.Format(sql, col.Attribute.DbType); - } else - { return sql; - } } public override string FormatSql(string sql, params object[] args) => sql?.FormatClickHouse(args); diff --git a/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs b/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs index 148c5148..b6275462 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengDbFirst.cs @@ -27,7 +27,7 @@ namespace FreeSql.Dameng public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); DmDbType GetSqlDbType(DbColumnInfo column) { - var dbfull = column.DbTypeTextFull.ToLower(); + var dbfull = column.DbTypeTextFull?.ToLower(); switch (dbfull) { case "number(1)": return DmDbType.Bit; @@ -55,7 +55,7 @@ namespace FreeSql.Dameng case "char(36)": return DmDbType.Char; } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "bit": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]); @@ -157,7 +157,7 @@ namespace FreeSql.Dameng return DmDbType.Double; case "rowid": default: - _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); + if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); return DmDbType.VarChar; } throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); diff --git a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs index 7376f7c4..5dc1bd37 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengUtils.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengUtils.cs @@ -18,7 +18,7 @@ namespace FreeSql.Dameng public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (DmDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (DmDbType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case DmDbType.Bit: @@ -40,7 +40,7 @@ namespace FreeSql.Dameng } break; } - var ret = new DmParameter { ParameterName = QuoteParamterName(parameterName), DmSqlType = dbtype, Value = value }; + var ret = new DmParameter { ParameterName = QuoteParamterName(parameterName), DmSqlType = dbtype ?? default, Value = value }; _params?.Add(ret); return ret; } diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdDbFirst.cs b/Providers/FreeSql.Provider.Firebird/FirebirdDbFirst.cs index 94929e43..a995b509 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdDbFirst.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdDbFirst.cs @@ -27,10 +27,10 @@ namespace FreeSql.Firebird FbDbType GetFbDbType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); FbDbType ret = FbDbType.VarChar; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "bigint": ret = FbDbType.BigInt; break; case "blob": ret = FbDbType.Binary; break; diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdUtils.cs b/Providers/FreeSql.Provider.Firebird/FirebirdUtils.cs index 28870b33..bb65b3e0 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdUtils.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdUtils.cs @@ -19,7 +19,7 @@ namespace FreeSql.Firebird { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var ret = new FbParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; - var dbtype = (FbDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (FbDbType?)_orm.CodeFirst.GetDbInfo(type)?.type; if (col != null) { var dbtype2 = (FbDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); @@ -35,7 +35,7 @@ namespace FreeSql.Firebird break; } } - ret.FbDbType = dbtype; + ret.FbDbType = dbtype ?? default; _params?.Add(ret); return ret; } diff --git a/Providers/FreeSql.Provider.GBase/GBaseDbFirst.cs b/Providers/FreeSql.Provider.GBase/GBaseDbFirst.cs index 25eb2aef..ddd2be1b 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseDbFirst.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseDbFirst.cs @@ -28,7 +28,7 @@ namespace FreeSql.GBase { var dbtype = column.DbTypeText; OdbcType ret = OdbcType.VarChar; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "int8": case "serial8": diff --git a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs index e477be5f..79f1e9d7 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs @@ -19,7 +19,7 @@ namespace FreeSql.GBase { if (string.IsNullOrEmpty(parameterName)) parameterName = "?"; var ret = new OdbcParameter { ParameterName = "?", Value = value }; - var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type; if (col != null) { var dbtype2 = (OdbcType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); @@ -35,7 +35,7 @@ namespace FreeSql.GBase break; } } - ret.OdbcType = dbtype; + ret.OdbcType = dbtype ?? default; _params?.Add(ret); return ret; } diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs index 89812228..630d4649 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESDbFirst.cs @@ -29,10 +29,10 @@ namespace FreeSql.KingbaseES KdbndpDbType GetSqlDbType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); var ret = KdbndpDbType.Unknown; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "tinyint": ret = KdbndpDbType.Smallint; break; case "int2": ret = KdbndpDbType.Smallint; break; diff --git a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs index 5cc547c3..93212a82 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs @@ -30,8 +30,8 @@ namespace FreeSql.MySql public int GetDbType(DbColumnInfo column) => (int)GetMySqlDbType(column); MySqlDbType GetMySqlDbType(DbColumnInfo column) { - var is_unsigned = column.DbTypeTextFull.ToLower().EndsWith(" unsigned"); - switch (column.DbTypeText.ToLower()) + var is_unsigned = column.DbTypeTextFull?.ToLower().EndsWith(" unsigned") == true; + switch (column.DbTypeText?.ToLower()) { case "bit": return MySqlDbType.Bit; diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index e63437e1..ed0b68e9 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -23,7 +23,7 @@ namespace FreeSql.MySql { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; - var dbtype = (MySqlDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (MySqlDbType?)_orm.CodeFirst.GetDbInfo(type)?.type; if (col != null) { var dbtype2 = (MySqlDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); @@ -46,7 +46,7 @@ namespace FreeSql.MySql if (value != null) ret.Value = (value as MygisGeometry).AsText(); } else - ret.MySqlDbType = dbtype; + ret.MySqlDbType = dbtype ?? default; _params?.Add(ret); return ret; } diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index 34a1abb3..a242f2d7 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -20,7 +20,7 @@ namespace FreeSql.MySql { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; - var dbtype = (MySqlDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (MySqlDbType?)_orm.CodeFirst.GetDbInfo(type)?.type; if (col != null) { var dbtype2 = (MySqlDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); @@ -44,7 +44,7 @@ namespace FreeSql.MySql } else { - ret.MySqlDbType = dbtype; + ret.MySqlDbType = dbtype ?? default; if (ret.MySqlDbType == MySqlDbType.Enum && value != null) ret.Value = EnumValueToMySql(value); } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs index ca9e5eff..f4384911 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengDbFirst.cs @@ -27,7 +27,7 @@ namespace FreeSql.Odbc.Dameng public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); OdbcType GetSqlDbType(DbColumnInfo column) { - var dbfull = column.DbTypeTextFull.ToLower(); + var dbfull = column.DbTypeTextFull?.ToLower(); switch (dbfull) { case "number(1)": return OdbcType.Bit; @@ -55,7 +55,7 @@ namespace FreeSql.Odbc.Dameng case "char(36)": return OdbcType.Char; } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "bit": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]); @@ -157,7 +157,7 @@ namespace FreeSql.Odbc.Dameng return OdbcType.Double; case "rowid": default: - _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); + if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); return OdbcType.NVarChar; } throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs index 7ed7ba65..a1c95f01 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengUtils.cs @@ -18,7 +18,7 @@ namespace FreeSql.Odbc.Dameng public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case OdbcType.Bit: @@ -36,7 +36,7 @@ namespace FreeSql.Odbc.Dameng value = string.Concat(value); break; } - var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), OdbcType = dbtype, Value = value }; + var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), OdbcType = dbtype ?? default, Value = value }; _params?.Add(ret); return ret; } @@ -44,7 +44,7 @@ namespace FreeSql.Odbc.Dameng public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, null, (name, type, value) => { - var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case OdbcType.Bit: @@ -62,7 +62,7 @@ namespace FreeSql.Odbc.Dameng value = string.Concat(value); break; } - var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype, Value = value }; + var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype ?? default, Value = value }; return ret; }); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs index cf53aa9f..2c91e65b 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESDbFirst.cs @@ -29,10 +29,10 @@ namespace FreeSql.Odbc.KingbaseES OdbcType GetSqlDbType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); var ret = OdbcType.VarChar; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "tinyint": ret = OdbcType.TinyInt; break; case "int2": ret = OdbcType.SmallInt; break; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs index c1e9254f..ff271ba2 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlDbFirst.cs @@ -26,8 +26,8 @@ namespace FreeSql.Odbc.MySql public int GetDbType(DbColumnInfo column) => (int)GetOdbcType(column); OdbcType GetOdbcType(DbColumnInfo column) { - var is_unsigned = column.DbTypeTextFull.ToLower().EndsWith(" unsigned"); - switch (column.DbTypeText.ToLower()) + var is_unsigned = column.DbTypeTextFull?.ToLower().EndsWith(" unsigned") == true; + switch (column.DbTypeText?.ToLower()) { case "bit": return OdbcType.Bit; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs index 7d78ee67..1d8f3275 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleDbFirst.cs @@ -27,7 +27,7 @@ namespace FreeSql.Odbc.Oracle public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); OdbcType GetSqlDbType(DbColumnInfo column) { - var dbfull = column.DbTypeTextFull.ToLower(); + var dbfull = column.DbTypeTextFull?.ToLower(); switch (dbfull) { case "number(1)": return OdbcType.Bit; @@ -55,7 +55,7 @@ namespace FreeSql.Odbc.Oracle case "char(36 char)": return OdbcType.Char; } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "number": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]); @@ -110,7 +110,7 @@ namespace FreeSql.Odbc.Oracle return OdbcType.Double; case "rowid": default: - _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); + if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); return OdbcType.NVarChar; } throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs index e8c9d76c..7ee2273d 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleUtils.cs @@ -18,7 +18,7 @@ namespace FreeSql.Odbc.Oracle public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case OdbcType.Bit: @@ -36,7 +36,7 @@ namespace FreeSql.Odbc.Oracle value = string.Concat(value); break; } - var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), OdbcType = dbtype, Value = value }; + var ret = new OdbcParameter { ParameterName = QuoteParamterName(parameterName), OdbcType = dbtype ?? default, Value = value }; _params?.Add(ret); return ret; } @@ -44,7 +44,7 @@ namespace FreeSql.Odbc.Oracle public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, null, (name, type, value) => { - var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case OdbcType.Bit: @@ -62,7 +62,7 @@ namespace FreeSql.Odbc.Oracle value = string.Concat(value); break; } - var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype, Value = value }; + var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype ?? default, Value = value }; return ret; }); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs index e4e0b467..26df9605 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLDbFirst.cs @@ -49,10 +49,10 @@ namespace FreeSql.Odbc.PostgreSQL OdbcType GetOdbcType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); OdbcType ret = OdbcType.VarChar; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "int2": ret = OdbcType.SmallInt; break; case "int4": ret = OdbcType.Int; break; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs index df5cfbba..e9f7a1d4 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerDbFirst.cs @@ -25,7 +25,7 @@ namespace FreeSql.Odbc.SqlServer public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); OdbcType GetSqlDbType(DbColumnInfo column) { - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "bit": return OdbcType.Bit; case "tinyint": return OdbcType.TinyInt; diff --git a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs index ecd21de4..cec07b03 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs @@ -27,7 +27,7 @@ namespace FreeSql.Oracle public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); OracleDbType GetSqlDbType(DbColumnInfo column) { - var dbfull = column.DbTypeTextFull.ToLower(); + var dbfull = column.DbTypeTextFull?.ToLower(); switch (dbfull) { case "number(1)": return OracleDbType.Boolean; @@ -55,7 +55,7 @@ namespace FreeSql.Oracle case "char(36 char)": return OracleDbType.Char; } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "number": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]); @@ -110,7 +110,7 @@ namespace FreeSql.Oracle return OracleDbType.BinaryDouble; case "rowid": default: - _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); + if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); return OracleDbType.NVarchar2; } throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 4dc706ab..728a6740 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -18,17 +18,18 @@ namespace FreeSql.Oracle public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (OracleDbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (OracleDbType?)_orm.CodeFirst.GetDbInfo(type)?.type; if (dbtype == OracleDbType.Boolean) { if (value == null) value = null; else value = (bool)value == true ? 1 : 0; dbtype = OracleDbType.Int16; } - var ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), OracleDbType = dbtype, Value = value }; + var ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; + if (dbtype != null) ret.OracleDbType = dbtype.Value; if (col != null) { - var dbtype2 = (OracleDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeTextFull = col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(), DbTypeText = col.DbTypeText }); + var dbtype2 = (OracleDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeTextFull = col.Attribute.DbType?.Replace("NOT NULL", "").Replace(" NULL", "").Trim(), DbTypeText = col.DbTypeText }); switch (dbtype2) { case OracleDbType.Char: diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs index 0aa6c59e..b6ef1fba 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs @@ -55,10 +55,10 @@ namespace FreeSql.PostgreSQL NpgsqlDbType GetNpgsqlDbType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); NpgsqlDbType ret = NpgsqlDbType.Unknown; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "int2": ret = NpgsqlDbType.Smallint; break; case "int4": ret = NpgsqlDbType.Integer; break; diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs index b52de0cd..a537b8f9 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs @@ -30,10 +30,10 @@ namespace FreeSql.ShenTong OscarDbType GetOscarDbType(DbColumnInfo column) { var dbtype = column.DbTypeText; - var isarray = dbtype.EndsWith("[]"); + var isarray = dbtype?.EndsWith("[]") == true; if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); OscarDbType ret = OscarDbType.Oidvector; - switch (dbtype.ToLower().TrimStart('_')) + switch (dbtype?.ToLower().TrimStart('_')) { case "int2": ret = OscarDbType.SmallInt; break; case "int4": ret = OscarDbType.Integer; break; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs index 2f501014..571dc09f 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs @@ -24,7 +24,7 @@ namespace FreeSql.SqlServer public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); SqlDbType GetSqlDbType(DbColumnInfo column) { - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "bit": return SqlDbType.Bit; case "tinyint": return SqlDbType.TinyInt; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs index c1b5eb56..e304a213 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteDbFirst.cs @@ -26,7 +26,7 @@ namespace FreeSql.Sqlite public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); DbType GetSqlDbType(DbColumnInfo column) { - var dbfull = column.DbTypeTextFull.ToLower(); + var dbfull = column.DbTypeTextFull?.ToLower(); switch (dbfull) { case "boolean": return DbType.Boolean; @@ -50,7 +50,7 @@ namespace FreeSql.Sqlite case "character(36)": return DbType.AnsiString; } - switch (column.DbTypeText.ToLower()) + switch (column.DbTypeText?.ToLower()) { case "int": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["integer"]); @@ -99,7 +99,7 @@ namespace FreeSql.Sqlite return DbType.String; default: - _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]); + if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]); return DbType.String; } throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 522f841c..3cd4c2d9 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -23,7 +23,7 @@ namespace FreeSql.Sqlite public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; - var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; + var dbtype = (DbType?)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { case DbType.Guid: @@ -43,7 +43,7 @@ namespace FreeSql.Sqlite var ret = new SQLiteParameter(); #endif ret.ParameterName = QuoteParamterName(parameterName); - ret.DbType = dbtype; + ret.DbType = dbtype ?? default; ret.Value = value; _params?.Add(ret); return ret;