- 增加 fsql.Insert(Dictionary<string, object>) 无实体类插入方法;#481

This commit is contained in:
2881099 2022-03-24 18:06:54 +08:00
parent 56ce675b65
commit dc688adc11
47 changed files with 416 additions and 80 deletions

View File

@ -141,6 +141,22 @@ namespace base_entity
BaseEntity.Initialization(fsql, () => _asyncUow.Value); BaseEntity.Initialization(fsql, () => _asyncUow.Value);
#endregion #endregion
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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++) for (var a = 0; a < 10000; a++)
fsql.Select<User1>().First(); fsql.Select<User1>().First();

View File

@ -5,7 +5,7 @@
<Version>3.2.100</Version> <Version>3.2.100</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>FreeSql;ncc;YeXiangQin</Authors> <Authors>FreeSql;ncc;YeXiangQin</Authors>
<Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 翰高, And Access</Description> <Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 南大通用, 翰高, And Access</Description>
<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/DbContext</PackageProjectUrl> <PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/DbContext</PackageProjectUrl>
<PackageTags>FreeSql ORM DbContext</PackageTags> <PackageTags>FreeSql ORM DbContext</PackageTags>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>

View File

@ -4,7 +4,7 @@
<TargetFrameworks>netstandard2.0;net60;net50;netcoreapp31;netcoreapp21;net45;net40</TargetFrameworks> <TargetFrameworks>netstandard2.0;net60;net50;netcoreapp31;netcoreapp21;net45;net40</TargetFrameworks>
<Version>3.2.100</Version> <Version>3.2.100</Version>
<Authors>FreeSql;ncc;YeXiangQin</Authors> <Authors>FreeSql;ncc;YeXiangQin</Authors>
<Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/翰高/Access, and read/write separation、and split table.</Description> <Description>FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓/神舟通用/南大通用/翰高/Access, and read/write separation、and split table.</Description>
<PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl> <PackageProjectUrl>https://github.com/2881099/FreeSql/wiki/Repository</PackageProjectUrl>
<PackageTags>FreeSql ORM Repository</PackageTags> <PackageTags>FreeSql ORM Repository</PackageTags>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

View File

@ -29,6 +29,31 @@ namespace FreeSql.Tests.MySqlConnector
} }
enum TestEnumInserTbType { str1, biggit, sum211 } enum TestEnumInserTbType { str1, biggit, sum211 }
[Fact]
public void InsertDictionary()
{
var fsql = g.mysql;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,37 @@ namespace FreeSql.Tests.Dameng
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.dameng;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,35 @@ namespace FreeSql.Tests.Firebird
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.firebird;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,27 @@ namespace FreeSql.Tests.MsAccess
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.msaccess;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -30,6 +30,31 @@ namespace FreeSql.Tests.MySql
} }
enum TestEnumInserTbType { str1, biggit, sum211 } enum TestEnumInserTbType { str1, biggit, sum211 }
[Fact]
public void InsertDictionary()
{
var fsql = g.mysql;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,37 @@ namespace FreeSql.Tests.Oracle
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.oracle;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,31 @@ namespace FreeSql.Tests.PostgreSQL
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.pgsql;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,31 @@ namespace FreeSql.Tests.ShenTong
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.shentong;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -32,6 +32,31 @@ namespace FreeSql.Tests.SqlServer
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.sqlserver;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -22,6 +22,31 @@ namespace FreeSql.Tests.Sqlite
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
} }
[Fact]
public void InsertDictionary()
{
var fsql = g.sqlite;
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("id", 1);
dic.Add("name", "xxxx");
var diclist = new List<Dictionary<string, object>>();
diclist.Add(dic);
diclist.Add(new Dictionary<string, object>
{
["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] [Fact]
public void AppendData() public void AppendData()
{ {

View File

@ -5,7 +5,7 @@
<Version>3.2.100</Version> <Version>3.2.100</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Authors>FreeSql;ncc;YeXiangQin</Authors> <Authors>FreeSql;ncc;YeXiangQin</Authors>
<Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 翰高, And Access</Description> <Description>FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Firebird, Odbc, 达梦, 人大金仓, 神舟通用, 南大通用, 翰高, And Access</Description>
<PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl> <PackageProjectUrl>https://github.com/2881099/FreeSql</PackageProjectUrl>
<RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl> <RepositoryUrl>https://github.com/2881099/FreeSql</RepositoryUrl>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>

View File

@ -1629,6 +1629,13 @@
<param name="tableRule"></param> <param name="tableRule"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.IInsert`1.AsTable(System.String)">
<summary>
设置表名
</summary>
<param name="tableName"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IInsert`1.AsType(System.Type)"> <member name="M:FreeSql.IInsert`1.AsType(System.Type)">
<summary> <summary>
动态Type在使用 Insert&lt;object&gt; 后使用本方法,指定实体类型 动态Type在使用 Insert&lt;object&gt; 后使用本方法,指定实体类型

View File

@ -119,6 +119,12 @@ namespace FreeSql
/// <returns></returns> /// <returns></returns>
IInsert<T1> AsTable(Func<string, string> tableRule); IInsert<T1> AsTable(Func<string, string> tableRule);
/// <summary> /// <summary>
/// 设置表名
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
IInsert<T1> AsTable(string tableName);
/// <summary>
/// 动态Type在使用 Insert&lt;object&gt; 后使用本方法,指定实体类型 /// 动态Type在使用 Insert&lt;object&gt; 后使用本方法,指定实体类型
/// </summary> /// </summary>
/// <param name="entityType"></param> /// <param name="entityType"></param>

View File

@ -94,7 +94,7 @@ namespace FreeSql.Internal.CommonProvider
protected void SyncStructure(params TypeAndName[] objects) protected void SyncStructure(params TypeAndName[] objects)
{ {
if (objects == null) return; 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(); .Select(a => new TypeAndName(a.entityType, GetTableNameLowerOrUpper(a.tableName))).ToArray();
if (syncObjects.Any() == false) return; if (syncObjects.Any() == false) return;
var before = new Aop.SyncStructureBeforeEventArgs(syncObjects.Select(a => a.entityType).ToArray()); var before = new Aop.SyncStructureBeforeEventArgs(syncObjects.Select(a => a.entityType).ToArray());

View File

@ -9,6 +9,7 @@ using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Collections;
namespace FreeSql.Internal.CommonProvider namespace FreeSql.Internal.CommonProvider
{ {
@ -115,6 +116,7 @@ namespace FreeSql.Internal.CommonProvider
{ {
if (source != null) if (source != null)
{ {
GetDictionaryTableInfo(source, _orm, ref _table);
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
_source.Add(source); _source.Add(source);
} }
@ -124,6 +126,7 @@ namespace FreeSql.Internal.CommonProvider
{ {
if (source != null) if (source != null)
{ {
GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table);
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
_source.AddRange(source); _source.AddRange(source);
} }
@ -134,12 +137,49 @@ namespace FreeSql.Internal.CommonProvider
if (source != null) if (source != null)
{ {
source = source.Where(a => a != null).ToList(); source = source.Where(a => a != null).ToList();
GetDictionaryTableInfo(source.FirstOrDefault(), _orm, ref _table);
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
_source.AddRange(source); _source.AddRange(source);
} }
return this; return this;
} }
public static void GetDictionaryTableInfo(T1 source, IFreeSql orm, ref TableInfo table)
{
if (table == null && typeof(T1) == typeof(Dictionary<string, object>))
{
var dic = source as Dictionary<string, object>;
table = new TableInfo();
table.Type = typeof(Dictionary<string, object>);
table.CsName = dic.TryGetValue("", out var tryval) ? string.Concat(tryval) : "";
table.DbName = table.CsName;
table.DisableSyncStructure = true;
table.IsDictionaryType = true;
var colpos = new List<ColumnInfo>();
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<T1> data, IFreeSql orm, TableInfo table, Dictionary<string, bool> changedDict) public static void AuditDataValue(object sender, IEnumerable<T1> data, IFreeSql orm, TableInfo table, Dictionary<string, bool> changedDict)
{ {
if (data?.Any() != true) return; 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<string, bool> changedDict) public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInfo table, Dictionary<string, bool> 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) if (typeof(T1) == typeof(object) && new[] { table.Type, table.TypeLazy }.Contains(data.GetType()) == false)
throw new Exception($"操作的数据类型({data.GetType().DisplayCsharp()}) 与 AsType({table.Type.DisplayCsharp()}) 不一致,请检查。"); throw new Exception($"操作的数据类型({data.GetType().DisplayCsharp()}) 与 AsType({table.Type.DisplayCsharp()}) 不一致,请检查。");
foreach (var col in table.Columns.Values) foreach (var col in table.Columns.Values)
@ -505,13 +545,14 @@ namespace FreeSql.Internal.CommonProvider
protected string TableRuleInvoke() protected string TableRuleInvoke()
{ {
if (_tableRule == null) return _table.DbName; var tbname = _table?.DbName ?? "";
var newname = _tableRule(_table.DbName); if (_tableRule == null) return tbname;
if (newname == _table.DbName) return _table.DbName; var newname = _tableRule(tbname);
if (string.IsNullOrEmpty(newname)) return _table.DbName; if (newname == tbname) return tbname;
if (string.IsNullOrEmpty(newname)) return tbname;
if (_orm.CodeFirst.IsSyncStructureToLower) newname = newname.ToLower(); if (_orm.CodeFirst.IsSyncStructureToLower) newname = newname.ToLower();
if (_orm.CodeFirst.IsSyncStructureToUpper) newname = newname.ToUpper(); 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; return newname;
} }
public IInsert<T1> AsTable(Func<string, string> tableRule) public IInsert<T1> AsTable(Func<string, string> tableRule)
@ -519,6 +560,11 @@ namespace FreeSql.Internal.CommonProvider
_tableRule = tableRule; _tableRule = tableRule;
return this; return this;
} }
public IInsert<T1> AsTable(string tableName)
{
_tableRule = (oldname) => tableName;
return this;
}
public IInsert<T1> AsType(Type entityType) public IInsert<T1> AsType(Type entityType)
{ {
if (entityType == typeof(object)) throw new Exception("IInsert.AsType 参数不支持指定为 object"); if (entityType == typeof(object)) throw new Exception("IInsert.AsType 参数不支持指定为 object");

View File

@ -31,6 +31,7 @@ namespace FreeSql.Internal.Model
/// <returns></returns> /// <returns></returns>
public object GetDbValue(object obj) public object GetDbValue(object obj)
{ {
if (Table.IsDictionaryType) return (obj as Dictionary<string, object>)?.TryGetValue(CsName, out var tryval) == true ? tryval : null;
var dbval = Table.GetPropertyValue(obj, CsName); var dbval = Table.GetPropertyValue(obj, CsName);
//if (ConversionCsToDb != null) dbval = ConversionCsToDb(dbval); //if (ConversionCsToDb != null) dbval = ConversionCsToDb(dbval);
if (Attribute.MapType != CsType) dbval = Utils.GetDataReaderValue(Attribute.MapType, dbval); if (Attribute.MapType != CsType) dbval = Utils.GetDataReaderValue(Attribute.MapType, dbval);
@ -40,7 +41,11 @@ namespace FreeSql.Internal.Model
/// 获取 obj.CsName 属性原始值(不经过 MapType /// 获取 obj.CsName 属性原始值(不经过 MapType
/// </summary> /// </summary>
/// <param name="obj"></param> /// <param name="obj"></param>
public object GetValue(object obj) => Table.GetPropertyValue(obj, CsName); public object GetValue(object obj)
{
if (Table.IsDictionaryType) return (obj as Dictionary<string, object>)?.TryGetValue(CsName, out var tryval) == true ? tryval : null;
return Table.GetPropertyValue(obj, CsName);
}
/// <summary> /// <summary>
/// 设置 obj.CsName 属性值 /// 设置 obj.CsName 属性值
/// </summary> /// </summary>

View File

@ -25,6 +25,7 @@ namespace FreeSql.Internal.Model
public bool DisableSyncStructure { get; set; } public bool DisableSyncStructure { get; set; }
public string Comment { get; internal set; } public string Comment { get; internal set; }
public bool IsRereadSql { get; internal set; } public bool IsRereadSql { get; internal set; }
public bool IsDictionaryType { get; internal set; }
public ColumnInfo VersionColumn { get; set; } public ColumnInfo VersionColumn { get; set; }

View File

@ -31,7 +31,7 @@ namespace FreeSql.ClickHouse
column.DbTypeText = column.DbTypeTextFull; column.DbTypeText = column.DbTypeTextFull;
//(?<=\()(\S +)(?=\)) //(?<=\()(\S +)(?=\))
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": case "bit":
case "tinyint": case "tinyint":
@ -86,7 +86,7 @@ namespace FreeSql.ClickHouse
case "varchar": return DbType.String; case "varchar": return DbType.String;
default: default:
{ {
if (column.DbTypeText.ToLower().Contains("datetime")) if (column.DbTypeText?.ToLower().Contains("datetime") == true)
return DbType.DateTime; return DbType.DateTime;
return DbType.String; return DbType.String;
} }

View File

@ -20,8 +20,8 @@ namespace FreeSql.ClickHouse
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; var dbtype = (DbType?)_orm.CodeFirst.GetDbInfo(type)?.type;
DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType = dbtype, Value = value };//QuoteParamterName(parameterName) DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType = dbtype ?? default, Value = value };//QuoteParamterName(parameterName)
if (col != null) if (col != null)
{ {
var dbtype2 = (DbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); 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.Value = (bool)value ? 1 : 0;
} }
} }
ret.DbType = dbtype;
_params?.Add(ret); _params?.Add(ret);
return ret; return ret;
} }
@ -52,9 +50,7 @@ namespace FreeSql.ClickHouse
DbParameter ret = new ClickHouseDbParameter { ParameterName = $"?{name}", Value = value }; DbParameter ret = new ClickHouseDbParameter { ParameterName = $"?{name}", Value = value };
var tp = _orm.CodeFirst.GetDbInfo(type)?.type; var tp = _orm.CodeFirst.GetDbInfo(type)?.type;
if (tp != null) if (tp != null)
{
ret.DbType = (DbType)tp.Value; ret.DbType = (DbType)tp.Value;
}
return ret; return ret;
}); });
@ -64,13 +60,9 @@ namespace FreeSql.ClickHouse
if (string.IsNullOrWhiteSpace(col?.Attribute.RewriteSql) == false) if (string.IsNullOrWhiteSpace(col?.Attribute.RewriteSql) == false)
return string.Format(col.Attribute.RewriteSql, sql); return string.Format(col.Attribute.RewriteSql, sql);
if (Regex.IsMatch(sql, @"\{\{[\w\d]+_+\d:\{\d\}\}\}")) if (Regex.IsMatch(sql, @"\{\{[\w\d]+_+\d:\{\d\}\}\}"))
{
return string.Format(sql, col.Attribute.DbType); return string.Format(sql, col.Attribute.DbType);
}
else else
{
return sql; return sql;
}
} }
public override string FormatSql(string sql, params object[] args) => sql?.FormatClickHouse(args); public override string FormatSql(string sql, params object[] args) => sql?.FormatClickHouse(args);

View File

@ -27,7 +27,7 @@ namespace FreeSql.Dameng
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
DmDbType GetSqlDbType(DbColumnInfo column) DmDbType GetSqlDbType(DbColumnInfo column)
{ {
var dbfull = column.DbTypeTextFull.ToLower(); var dbfull = column.DbTypeTextFull?.ToLower();
switch (dbfull) switch (dbfull)
{ {
case "number(1)": return DmDbType.Bit; case "number(1)": return DmDbType.Bit;
@ -55,7 +55,7 @@ namespace FreeSql.Dameng
case "char(36)": return DmDbType.Char; case "char(36)": return DmDbType.Char;
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": case "bit":
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]); _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]);
@ -157,7 +157,7 @@ namespace FreeSql.Dameng
return DmDbType.Double; return DmDbType.Double;
case "rowid": case "rowid":
default: default:
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
return DmDbType.VarChar; return DmDbType.VarChar;
} }
throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");

View File

@ -18,7 +18,7 @@ namespace FreeSql.Dameng
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; 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) switch (dbtype)
{ {
case DmDbType.Bit: case DmDbType.Bit:
@ -40,7 +40,7 @@ namespace FreeSql.Dameng
} }
break; 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); _params?.Add(ret);
return ret; return ret;
} }

View File

@ -27,10 +27,10 @@ namespace FreeSql.Firebird
FbDbType GetFbDbType(DbColumnInfo column) FbDbType GetFbDbType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
FbDbType ret = FbDbType.VarChar; FbDbType ret = FbDbType.VarChar;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "bigint": ret = FbDbType.BigInt; break; case "bigint": ret = FbDbType.BigInt; break;
case "blob": ret = FbDbType.Binary; break; case "blob": ret = FbDbType.Binary; break;

View File

@ -19,7 +19,7 @@ namespace FreeSql.Firebird
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var ret = new FbParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; 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) if (col != null)
{ {
var dbtype2 = (FbDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); 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; break;
} }
} }
ret.FbDbType = dbtype; ret.FbDbType = dbtype ?? default;
_params?.Add(ret); _params?.Add(ret);
return ret; return ret;
} }

View File

@ -28,7 +28,7 @@ namespace FreeSql.GBase
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
OdbcType ret = OdbcType.VarChar; OdbcType ret = OdbcType.VarChar;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "int8": case "int8":
case "serial8": case "serial8":

View File

@ -19,7 +19,7 @@ namespace FreeSql.GBase
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = "?"; if (string.IsNullOrEmpty(parameterName)) parameterName = "?";
var ret = new OdbcParameter { ParameterName = "?", Value = value }; 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) if (col != null)
{ {
var dbtype2 = (OdbcType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); 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; break;
} }
} }
ret.OdbcType = dbtype; ret.OdbcType = dbtype ?? default;
_params?.Add(ret); _params?.Add(ret);
return ret; return ret;
} }

View File

@ -29,10 +29,10 @@ namespace FreeSql.KingbaseES
KdbndpDbType GetSqlDbType(DbColumnInfo column) KdbndpDbType GetSqlDbType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
var ret = KdbndpDbType.Unknown; var ret = KdbndpDbType.Unknown;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "tinyint": ret = KdbndpDbType.Smallint; break; case "tinyint": ret = KdbndpDbType.Smallint; break;
case "int2": ret = KdbndpDbType.Smallint; break; case "int2": ret = KdbndpDbType.Smallint; break;

View File

@ -30,8 +30,8 @@ namespace FreeSql.MySql
public int GetDbType(DbColumnInfo column) => (int)GetMySqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetMySqlDbType(column);
MySqlDbType GetMySqlDbType(DbColumnInfo column) MySqlDbType GetMySqlDbType(DbColumnInfo column)
{ {
var is_unsigned = column.DbTypeTextFull.ToLower().EndsWith(" unsigned"); var is_unsigned = column.DbTypeTextFull?.ToLower().EndsWith(" unsigned") == true;
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": return MySqlDbType.Bit; case "bit": return MySqlDbType.Bit;

View File

@ -23,7 +23,7 @@ namespace FreeSql.MySql
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; 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) if (col != null)
{ {
var dbtype2 = (MySqlDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); 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(); if (value != null) ret.Value = (value as MygisGeometry).AsText();
} }
else else
ret.MySqlDbType = dbtype; ret.MySqlDbType = dbtype ?? default;
_params?.Add(ret); _params?.Add(ret);
return ret; return ret;
} }

View File

@ -20,7 +20,7 @@ namespace FreeSql.MySql
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; 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) if (col != null)
{ {
var dbtype2 = (MySqlDbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize }); 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 else
{ {
ret.MySqlDbType = dbtype; ret.MySqlDbType = dbtype ?? default;
if (ret.MySqlDbType == MySqlDbType.Enum && value != null) if (ret.MySqlDbType == MySqlDbType.Enum && value != null)
ret.Value = EnumValueToMySql(value); ret.Value = EnumValueToMySql(value);
} }

View File

@ -27,7 +27,7 @@ namespace FreeSql.Odbc.Dameng
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
OdbcType GetSqlDbType(DbColumnInfo column) OdbcType GetSqlDbType(DbColumnInfo column)
{ {
var dbfull = column.DbTypeTextFull.ToLower(); var dbfull = column.DbTypeTextFull?.ToLower();
switch (dbfull) switch (dbfull)
{ {
case "number(1)": return OdbcType.Bit; case "number(1)": return OdbcType.Bit;
@ -55,7 +55,7 @@ namespace FreeSql.Odbc.Dameng
case "char(36)": return OdbcType.Char; case "char(36)": return OdbcType.Char;
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": case "bit":
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]); _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(1)"]);
@ -157,7 +157,7 @@ namespace FreeSql.Odbc.Dameng
return OdbcType.Double; return OdbcType.Double;
case "rowid": case "rowid":
default: default:
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
return OdbcType.NVarChar; return OdbcType.NVarChar;
} }
throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");

View File

@ -18,7 +18,7 @@ namespace FreeSql.Odbc.Dameng
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; 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) switch (dbtype)
{ {
case OdbcType.Bit: case OdbcType.Bit:
@ -36,7 +36,7 @@ namespace FreeSql.Odbc.Dameng
value = string.Concat(value); value = string.Concat(value);
break; 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); _params?.Add(ret);
return ret; return ret;
} }
@ -44,7 +44,7 @@ namespace FreeSql.Odbc.Dameng
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => public override DbParameter[] GetDbParamtersByObject(string sql, object obj) =>
Utils.GetDbParamtersByObject<OdbcParameter>(sql, obj, null, (name, type, value) => Utils.GetDbParamtersByObject<OdbcParameter>(sql, obj, null, (name, type, value) =>
{ {
var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type;
switch (dbtype) switch (dbtype)
{ {
case OdbcType.Bit: case OdbcType.Bit:
@ -62,7 +62,7 @@ namespace FreeSql.Odbc.Dameng
value = string.Concat(value); value = string.Concat(value);
break; break;
} }
var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype, Value = value }; var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype ?? default, Value = value };
return ret; return ret;
}); });

View File

@ -29,10 +29,10 @@ namespace FreeSql.Odbc.KingbaseES
OdbcType GetSqlDbType(DbColumnInfo column) OdbcType GetSqlDbType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
var ret = OdbcType.VarChar; var ret = OdbcType.VarChar;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "tinyint": ret = OdbcType.TinyInt; break; case "tinyint": ret = OdbcType.TinyInt; break;
case "int2": ret = OdbcType.SmallInt; break; case "int2": ret = OdbcType.SmallInt; break;

View File

@ -26,8 +26,8 @@ namespace FreeSql.Odbc.MySql
public int GetDbType(DbColumnInfo column) => (int)GetOdbcType(column); public int GetDbType(DbColumnInfo column) => (int)GetOdbcType(column);
OdbcType GetOdbcType(DbColumnInfo column) OdbcType GetOdbcType(DbColumnInfo column)
{ {
var is_unsigned = column.DbTypeTextFull.ToLower().EndsWith(" unsigned"); var is_unsigned = column.DbTypeTextFull?.ToLower().EndsWith(" unsigned") == true;
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": return OdbcType.Bit; case "bit": return OdbcType.Bit;

View File

@ -27,7 +27,7 @@ namespace FreeSql.Odbc.Oracle
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
OdbcType GetSqlDbType(DbColumnInfo column) OdbcType GetSqlDbType(DbColumnInfo column)
{ {
var dbfull = column.DbTypeTextFull.ToLower(); var dbfull = column.DbTypeTextFull?.ToLower();
switch (dbfull) switch (dbfull)
{ {
case "number(1)": return OdbcType.Bit; case "number(1)": return OdbcType.Bit;
@ -55,7 +55,7 @@ namespace FreeSql.Odbc.Oracle
case "char(36 char)": return OdbcType.Char; case "char(36 char)": return OdbcType.Char;
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "number": case "number":
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]); _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]);
@ -110,7 +110,7 @@ namespace FreeSql.Odbc.Oracle
return OdbcType.Double; return OdbcType.Double;
case "rowid": case "rowid":
default: default:
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
return OdbcType.NVarChar; return OdbcType.NVarChar;
} }
throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");

View File

@ -18,7 +18,7 @@ namespace FreeSql.Odbc.Oracle
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; 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) switch (dbtype)
{ {
case OdbcType.Bit: case OdbcType.Bit:
@ -36,7 +36,7 @@ namespace FreeSql.Odbc.Oracle
value = string.Concat(value); value = string.Concat(value);
break; 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); _params?.Add(ret);
return ret; return ret;
} }
@ -44,7 +44,7 @@ namespace FreeSql.Odbc.Oracle
public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => public override DbParameter[] GetDbParamtersByObject(string sql, object obj) =>
Utils.GetDbParamtersByObject<OdbcParameter>(sql, obj, null, (name, type, value) => Utils.GetDbParamtersByObject<OdbcParameter>(sql, obj, null, (name, type, value) =>
{ {
var dbtype = (OdbcType)_orm.CodeFirst.GetDbInfo(type)?.type; var dbtype = (OdbcType?)_orm.CodeFirst.GetDbInfo(type)?.type;
switch (dbtype) switch (dbtype)
{ {
case OdbcType.Bit: case OdbcType.Bit:
@ -62,7 +62,7 @@ namespace FreeSql.Odbc.Oracle
value = string.Concat(value); value = string.Concat(value);
break; break;
} }
var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype, Value = value }; var ret = new OdbcParameter { ParameterName = $":{name}", OdbcType = dbtype ?? default, Value = value };
return ret; return ret;
}); });

View File

@ -49,10 +49,10 @@ namespace FreeSql.Odbc.PostgreSQL
OdbcType GetOdbcType(DbColumnInfo column) OdbcType GetOdbcType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
OdbcType ret = OdbcType.VarChar; OdbcType ret = OdbcType.VarChar;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "int2": ret = OdbcType.SmallInt; break; case "int2": ret = OdbcType.SmallInt; break;
case "int4": ret = OdbcType.Int; break; case "int4": ret = OdbcType.Int; break;

View File

@ -25,7 +25,7 @@ namespace FreeSql.Odbc.SqlServer
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
OdbcType GetSqlDbType(DbColumnInfo column) OdbcType GetSqlDbType(DbColumnInfo column)
{ {
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": return OdbcType.Bit; case "bit": return OdbcType.Bit;
case "tinyint": return OdbcType.TinyInt; case "tinyint": return OdbcType.TinyInt;

View File

@ -27,7 +27,7 @@ namespace FreeSql.Oracle
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
OracleDbType GetSqlDbType(DbColumnInfo column) OracleDbType GetSqlDbType(DbColumnInfo column)
{ {
var dbfull = column.DbTypeTextFull.ToLower(); var dbfull = column.DbTypeTextFull?.ToLower();
switch (dbfull) switch (dbfull)
{ {
case "number(1)": return OracleDbType.Boolean; case "number(1)": return OracleDbType.Boolean;
@ -55,7 +55,7 @@ namespace FreeSql.Oracle
case "char(36 char)": return OracleDbType.Char; case "char(36 char)": return OracleDbType.Char;
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "number": case "number":
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]); _dicDbToCs.TryAdd(dbfull, _dicDbToCs["number(10,2)"]);
@ -110,7 +110,7 @@ namespace FreeSql.Oracle
return OracleDbType.BinaryDouble; return OracleDbType.BinaryDouble;
case "rowid": case "rowid":
default: default:
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]); if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar2(255)"]);
return OracleDbType.NVarchar2; return OracleDbType.NVarchar2;
} }
throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");

View File

@ -18,17 +18,18 @@ namespace FreeSql.Oracle
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; 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 (dbtype == OracleDbType.Boolean)
{ {
if (value == null) value = null; if (value == null) value = null;
else value = (bool)value == true ? 1 : 0; else value = (bool)value == true ? 1 : 0;
dbtype = OracleDbType.Int16; 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) 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) switch (dbtype2)
{ {
case OracleDbType.Char: case OracleDbType.Char:

View File

@ -55,10 +55,10 @@ namespace FreeSql.PostgreSQL
NpgsqlDbType GetNpgsqlDbType(DbColumnInfo column) NpgsqlDbType GetNpgsqlDbType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
NpgsqlDbType ret = NpgsqlDbType.Unknown; NpgsqlDbType ret = NpgsqlDbType.Unknown;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "int2": ret = NpgsqlDbType.Smallint; break; case "int2": ret = NpgsqlDbType.Smallint; break;
case "int4": ret = NpgsqlDbType.Integer; break; case "int4": ret = NpgsqlDbType.Integer; break;

View File

@ -30,10 +30,10 @@ namespace FreeSql.ShenTong
OscarDbType GetOscarDbType(DbColumnInfo column) OscarDbType GetOscarDbType(DbColumnInfo column)
{ {
var dbtype = column.DbTypeText; var dbtype = column.DbTypeText;
var isarray = dbtype.EndsWith("[]"); var isarray = dbtype?.EndsWith("[]") == true;
if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2); if (isarray) dbtype = dbtype.Remove(dbtype.Length - 2);
OscarDbType ret = OscarDbType.Oidvector; OscarDbType ret = OscarDbType.Oidvector;
switch (dbtype.ToLower().TrimStart('_')) switch (dbtype?.ToLower().TrimStart('_'))
{ {
case "int2": ret = OscarDbType.SmallInt; break; case "int2": ret = OscarDbType.SmallInt; break;
case "int4": ret = OscarDbType.Integer; break; case "int4": ret = OscarDbType.Integer; break;

View File

@ -24,7 +24,7 @@ namespace FreeSql.SqlServer
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
SqlDbType GetSqlDbType(DbColumnInfo column) SqlDbType GetSqlDbType(DbColumnInfo column)
{ {
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "bit": return SqlDbType.Bit; case "bit": return SqlDbType.Bit;
case "tinyint": return SqlDbType.TinyInt; case "tinyint": return SqlDbType.TinyInt;

View File

@ -26,7 +26,7 @@ namespace FreeSql.Sqlite
public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column); public int GetDbType(DbColumnInfo column) => (int)GetSqlDbType(column);
DbType GetSqlDbType(DbColumnInfo column) DbType GetSqlDbType(DbColumnInfo column)
{ {
var dbfull = column.DbTypeTextFull.ToLower(); var dbfull = column.DbTypeTextFull?.ToLower();
switch (dbfull) switch (dbfull)
{ {
case "boolean": return DbType.Boolean; case "boolean": return DbType.Boolean;
@ -50,7 +50,7 @@ namespace FreeSql.Sqlite
case "character(36)": return DbType.AnsiString; case "character(36)": return DbType.AnsiString;
} }
switch (column.DbTypeText.ToLower()) switch (column.DbTypeText?.ToLower())
{ {
case "int": case "int":
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["integer"]); _dicDbToCs.TryAdd(dbfull, _dicDbToCs["integer"]);
@ -99,7 +99,7 @@ namespace FreeSql.Sqlite
return DbType.String; return DbType.String;
default: default:
_dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]); if (dbfull != null) _dicDbToCs.TryAdd(dbfull, _dicDbToCs["nvarchar(255)"]);
return DbType.String; return DbType.String;
} }
throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射"); throw new NotImplementedException($"未实现 {column.DbTypeTextFull} 类型映射");

View File

@ -23,7 +23,7 @@ namespace FreeSql.Sqlite
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value) public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
{ {
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; 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) switch (dbtype)
{ {
case DbType.Guid: case DbType.Guid:
@ -43,7 +43,7 @@ namespace FreeSql.Sqlite
var ret = new SQLiteParameter(); var ret = new SQLiteParameter();
#endif #endif
ret.ParameterName = QuoteParamterName(parameterName); ret.ParameterName = QuoteParamterName(parameterName);
ret.DbType = dbtype; ret.DbType = dbtype ?? default;
ret.Value = value; ret.Value = value;
_params?.Add(ret); _params?.Add(ret);
return ret; return ret;