From 1fa6c9bfc4a39cd5e78d1f302076b6af964c4751 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 13 Mar 2019 18:24:54 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20ISelect.ToDataTable=20?= =?UTF-8?q?=E7=B3=BB=E5=88=97=E6=96=B9=E6=B3=95=EF=BC=9B=20-=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20=E6=97=A0=E5=8F=82=E6=95=B0=E5=8C=96=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E6=89=A7=E8=A1=8C=EF=BC=8C=E4=BE=BF=E4=BA=8E=E8=B0=83?= =?UTF-8?q?=E8=AF=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extenssions/IFreeSqlExtenssions.cs | 1 + FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs | 17 +- FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs | 15 + .../SqlServer/Curd/SqlServerSelectTest.cs | 15 + .../SqlServer/SqlServerCodeFirstTest.cs | 2 +- FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs | 15 + FreeSql.Tests/g.cs | 26 +- FreeSql/DataAnnotations/ColumnFluent.cs | 4 +- FreeSql/DataAnnotations/TableFluent.cs | 1 - FreeSql/DatabaseModel/DBColumnInfo.cs | 2 - FreeSql/DatabaseModel/DBTableInfo.cs | 4 +- FreeSql/DatabaseModel/DbEnumInfo.cs | 4 +- FreeSql/DatabaseModel/DbForeignInfo.cs | 4 +- FreeSql/DatabaseModel/DbTypeInfo.cs | 4 +- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 16 +- FreeSql/Interface/Curd/ISelect/ISelect0.cs | 8 + FreeSql/Interface/Curd/ISelect/ISelect1.cs | 8 + FreeSql/Interface/Curd/ISelect/ISelect10.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect3.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect4.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect5.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect6.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect7.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect8.cs | 4 + FreeSql/Interface/Curd/ISelect/ISelect9.cs | 4 + .../Internal/CommonProvider/InsertProvider.cs | 12 +- .../SelectProvider/Select0Provider.cs | 18 + .../SelectProvider/Select10Provider.cs | 5 + .../SelectProvider/Select1Provider.cs | 5 + .../SelectProvider/Select3Provider.cs | 5 + .../SelectProvider/Select4Provider.cs | 5 + .../SelectProvider/Select5Provider.cs | 5 + .../SelectProvider/Select6Provider.cs | 5 + .../SelectProvider/Select7Provider.cs | 5 + .../SelectProvider/Select8Provider.cs | 5 + .../SelectProvider/Select9Provider.cs | 5 + FreeSql/Internal/CommonUtils.cs | 1 + FreeSql/MySql/MySqlAdo/MySqlAdo.cs | 12 +- FreeSql/MySql/MySqlUtils.cs | 19 ++ FreeSql/Oracle/Curd/OracleInsert.cs | 14 +- FreeSql/Oracle/OracleAdo/OracleAdo.cs | 10 +- FreeSql/Oracle/OracleUtils.cs | 16 + .../PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs | 8 +- FreeSql/PostgreSQL/PostgreSQLUtils.cs | 21 ++ FreeSql/SqlServer/Curd/SqlServerInsert.cs | 317 ++++-------------- FreeSql/SqlServer/Curd/SqlServerInsert2100.cs | 281 ++++++++++++++++ .../SqlServer/SqlServerAdo/SqlServerAdo.cs | 17 +- FreeSql/SqlServer/SqlServerUtils.cs | 20 ++ FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs | 10 +- FreeSql/Sqlite/SqliteUtils.cs | 8 + 50 files changed, 676 insertions(+), 331 deletions(-) create mode 100644 FreeSql/SqlServer/Curd/SqlServerInsert2100.cs diff --git a/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs b/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs index 3413b8ef..5b049e93 100644 --- a/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs +++ b/FreeSql.Repository/Extenssions/IFreeSqlExtenssions.cs @@ -5,6 +5,7 @@ using System.Collections.Concurrent; using System.Text; using System.Linq.Expressions; using System.Linq; +using System.Data; public static class FreeSqlRepositoryIFreeSqlExtenssions { diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 01036895..9a3782ed 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -85,10 +85,23 @@ namespace FreeSql.Tests.MySql { .ToSql(); var songs = g.mysql.Select().Limit(10).ToList(); - - } + [Fact] + public void ToDataTable() { + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + + Assert.Equal(1, g.mysql.Insert().AppendData(items.First()).ExecuteAffrows()); + Assert.Equal(10, g.mysql.Insert().AppendData(items).ExecuteAffrows()); + + items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList(); + Assert.Equal(9989, g.mysql.Insert(items).ExecuteAffrows()); + + var dt1 = select.Limit(10).ToDataTable(); + var dt2 = select.Limit(10).ToDataTable("id, 111222"); + var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now }); + } [Fact] public void ToList() { var t0 = select.Limit(50).ToList(); diff --git a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index bba47408..015a70f2 100644 --- a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -32,6 +32,21 @@ namespace FreeSql.Tests.Oracle { public List Types { get; set; } } + [Fact] + public void ToDataTable() { + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + + Assert.Equal(1, g.oracle.Insert().AppendData(items.First()).ExecuteAffrows()); + Assert.Equal(10, g.oracle.Insert().AppendData(items).ExecuteAffrows()); + + items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList(); + Assert.Equal(9989, g.oracle.Insert(items).ExecuteAffrows()); + + var dt1 = select.Limit(10).ToDataTable(); + var dt2 = select.Limit(10).ToDataTable("id, 111222"); + var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now }); + } [Fact] public void ToList() { } diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index c78ba06e..cf715a22 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -32,6 +32,21 @@ namespace FreeSql.Tests.SqlServer { public List Types { get; set; } } + [Fact] + public void ToDataTable() { + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + + Assert.Single(g.sqlserver.Insert().AppendData(items.First()).ExecuteInserted()); + Assert.Equal(10, g.sqlserver.Insert().AppendData(items).ExecuteInserted().Count); + + //items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList(); + //Assert.Equal(9989, g.sqlserver.Insert(items).ExecuteAffrows()); + + var dt1 = select.Limit(10).ToDataTable(); + var dt2 = select.Limit(10).ToDataTable("id, getdate()"); + var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now }); + } [Fact] public void ToList() { } diff --git a/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index 5cc90bb9..eae53818 100644 --- a/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -59,7 +59,7 @@ namespace FreeSql.Tests.SqlServer { testFieldBoolNullable = true, testFieldByte = byte.MaxValue, testFieldByteNullable = byte.MinValue, - testFieldBytes = Encoding.UTF8.GetBytes("我是中国人"), + testFieldBytes = Encoding.GetEncoding("gb2312").GetBytes("我是中国人"), testFieldDateTime = DateTime.Now, testFieldDateTimeNullable = DateTime.Now.AddHours(1), testFieldDateTimeNullableOffset = new DateTimeOffset(DateTime.Now.AddHours(1), TimeSpan.FromHours(8)), diff --git a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index a5bd202d..2c705611 100644 --- a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -73,6 +73,21 @@ namespace FreeSql.Tests.Sqlite { } + [Fact] + public void ToDataTable() { + var items = new List(); + for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now }); + + Assert.Equal(1, g.sqlite.Insert().AppendData(items.First()).ExecuteAffrows()); + Assert.Equal(10, g.sqlite.Insert().AppendData(items).ExecuteAffrows()); + + items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList(); + Assert.Equal(9989, g.sqlite.Insert(items).ExecuteAffrows()); + + var dt1 = select.Limit(10).ToDataTable(); + var dt2 = select.Limit(10).ToDataTable("id, 111222"); + var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now }); + } [Fact] public void ToList() { } diff --git a/FreeSql.Tests/g.cs b/FreeSql.Tests/g.cs index 2634a0d6..c008dda1 100644 --- a/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/g.cs @@ -6,10 +6,9 @@ using System.Text; public class g { - public static IFreeSql mysql = new FreeSql.FreeSqlBuilder() + static Lazy mysqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") .UseAutoSyncStructure(true) - .UseMonitorCommand( cmd => { Trace.WriteLine(cmd.CommandText); @@ -18,31 +17,36 @@ public class g { Console.WriteLine(traceLog); }) //鐩戝惉SQL鍛戒护瀵硅薄锛屽湪鎵ц鍚 .UseLazyLoading(true) - .Build(); + .Build()); + public static IFreeSql mysql => mysqlLazy.Value; - public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder() + static Lazy sqlserverLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=cms;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) - .Build(); + .Build()); + public static IFreeSql sqlserver => sqlserverLazy.Value; - public static IFreeSql pgsql = new FreeSql.FreeSqlBuilder() + static Lazy pgsqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=10") .UseAutoSyncStructure(true) .UseSyncStructureToLower(true) .UseLazyLoading(true) - .Build(); + .Build()); + public static IFreeSql pgsql => pgsqlLazy.Value; - public static IFreeSql oracle = new FreeSql.FreeSqlBuilder() + static Lazy oracleLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) .UseSyncStructureToUpper(true) - .Build(); + .Build()); + public static IFreeSql oracle = oracleLazy.Value; - public static IFreeSql sqlite = new FreeSql.FreeSqlBuilder() + static Lazy sqliteLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) - .Build(); + .Build()); + public static IFreeSql sqlite = sqliteLazy.Value; } diff --git a/FreeSql/DataAnnotations/ColumnFluent.cs b/FreeSql/DataAnnotations/ColumnFluent.cs index 4d05e5e1..7b6ae7f2 100644 --- a/FreeSql/DataAnnotations/ColumnFluent.cs +++ b/FreeSql/DataAnnotations/ColumnFluent.cs @@ -1,6 +1,4 @@ -锘縰sing System; - -namespace FreeSql.DataAnnotations { +锘縩amespace FreeSql.DataAnnotations { public class ColumnFluent { public ColumnFluent(ColumnAttribute column) { diff --git a/FreeSql/DataAnnotations/TableFluent.cs b/FreeSql/DataAnnotations/TableFluent.cs index 944d380d..781a812b 100644 --- a/FreeSql/DataAnnotations/TableFluent.cs +++ b/FreeSql/DataAnnotations/TableFluent.cs @@ -1,6 +1,5 @@ 锘縰sing System; using System.Collections.Generic; -using System.Collections.Concurrent; using System.Linq; using System.Linq.Expressions; using System.Reflection; diff --git a/FreeSql/DatabaseModel/DBColumnInfo.cs b/FreeSql/DatabaseModel/DBColumnInfo.cs index b4351f7c..62fec15d 100644 --- a/FreeSql/DatabaseModel/DBColumnInfo.cs +++ b/FreeSql/DatabaseModel/DBColumnInfo.cs @@ -1,6 +1,4 @@ 锘縰sing System; -using System.Collections.Generic; -using System.Text; namespace FreeSql.DatabaseModel { public class DbColumnInfo { diff --git a/FreeSql/DatabaseModel/DBTableInfo.cs b/FreeSql/DatabaseModel/DBTableInfo.cs index f5251e64..6ecc139f 100644 --- a/FreeSql/DatabaseModel/DBTableInfo.cs +++ b/FreeSql/DatabaseModel/DBTableInfo.cs @@ -1,6 +1,4 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Text; +锘縰sing System.Collections.Generic; namespace FreeSql.DatabaseModel { public class DbTableInfo { diff --git a/FreeSql/DatabaseModel/DbEnumInfo.cs b/FreeSql/DatabaseModel/DbEnumInfo.cs index bd237cf8..93638af0 100644 --- a/FreeSql/DatabaseModel/DbEnumInfo.cs +++ b/FreeSql/DatabaseModel/DbEnumInfo.cs @@ -1,6 +1,4 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Text; +锘縰sing System.Collections.Generic; namespace FreeSql.DatabaseModel { public class DbEnumInfo { diff --git a/FreeSql/DatabaseModel/DbForeignInfo.cs b/FreeSql/DatabaseModel/DbForeignInfo.cs index ef805e24..eda23933 100644 --- a/FreeSql/DatabaseModel/DbForeignInfo.cs +++ b/FreeSql/DatabaseModel/DbForeignInfo.cs @@ -1,6 +1,4 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Text; +锘縰sing System.Collections.Generic; namespace FreeSql.DatabaseModel { public class DbForeignInfo { diff --git a/FreeSql/DatabaseModel/DbTypeInfo.cs b/FreeSql/DatabaseModel/DbTypeInfo.cs index 2440283d..425a8821 100644 --- a/FreeSql/DatabaseModel/DbTypeInfo.cs +++ b/FreeSql/DatabaseModel/DbTypeInfo.cs @@ -1,6 +1,4 @@ -锘縰sing System; -using System.Collections.Generic; -using System.Text; +锘縰sing System.Collections.Generic; namespace FreeSql.DatabaseModel { public class DbTypeInfo { diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 64468f2f..b69d8d43 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Collections.Concurrent; using System.ComponentModel; using System.Data; using System.Drawing; @@ -43,10 +44,12 @@ public static class FreeSqlGlobalExtensions { return 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin((radLat1 - radLat2) / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin((radLng1 - radLng2) / 2), 2))) * 6378137; } + static ConcurrentDictionary _dicGetFields = new ConcurrentDictionary(); public static object GetEnum(this IDataReader dr, int index) { - string value = dr.GetString(index); - Type t = typeof(T); - foreach (var f in t.GetFields()) + var value = dr.GetString(index); + var t = typeof(T); + var fs = _dicGetFields.GetOrAdd(t, t2 => t2.GetFields()); + foreach (var f in fs) if (f.GetCustomAttribute()?.Description == value || f.Name == value) return Enum.Parse(t, f.Name, true); return null; } @@ -60,10 +63,11 @@ public static class FreeSqlGlobalExtensions { return Convert.ToInt64(item); } public static IEnumerable ToSet(this long value) { - List ret = new List(); + var ret = new List(); if (value == 0) return ret; - Type t = typeof(T); - foreach (FieldInfo f in t.GetFields()) { + var t = typeof(T); + var fs = _dicGetFields.GetOrAdd(t, t2 => t2.GetFields()); + foreach (var f in fs) { if (f.FieldType != t) continue; object o = Enum.Parse(t, f.Name, true); long v = (long)o; diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index f0ca6378..472e5d52 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Data.Common; using System.Linq.Expressions; using System.Text; @@ -15,6 +16,13 @@ namespace FreeSql { /// TSelect WithTransaction(DbTransaction transaction); + /// + /// 鎵цSQL鏌ヨ锛岃繑鍥 DataTable + /// + /// + DataTable ToDataTable(string field = null); + Task ToDataTableAsync(string field = null); + /// /// 鎵цSQL鏌ヨ锛岃繑鍥 T1 瀹炰綋鎵鏈夊瓧娈电殑璁板綍锛岃褰曚笉瀛樺湪鏃惰繑鍥 Count 涓 0 鐨勫垪琛 /// diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index b407b933..a7968e63 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -14,6 +15,13 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + /// + /// 鎵цSQL鏌ヨ锛岃繑鍥 DataTable + /// + /// + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + /// /// 鎵цSQL鏌ヨ锛岃繑鍥炴寚瀹氬瓧娈电殑璁板綍锛岃褰曚笉瀛樺湪鏃惰繑鍥 Count 涓 0 鐨勫垪琛 /// diff --git a/FreeSql/Interface/Curd/ISelect/ISelect10.cs b/FreeSql/Interface/Curd/ISelect/ISelect10.cs index c4776b94..cf51ead7 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect10.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect10.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect3.cs b/FreeSql/Interface/Curd/ISelect/ISelect3.cs index 951ffbce..f352a292 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect3.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect3.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect4.cs b/FreeSql/Interface/Curd/ISelect/ISelect4.cs index 5f501458..b7fa9f75 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect4.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect4.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect5.cs b/FreeSql/Interface/Curd/ISelect/ISelect5.cs index b0285e0d..68bceb4e 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect5.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect5.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect6.cs b/FreeSql/Interface/Curd/ISelect/ISelect6.cs index 18320b53..02d1f656 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect6.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect6.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect7.cs b/FreeSql/Interface/Curd/ISelect/ISelect7.cs index 4d9b93a7..d44c45a3 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect7.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect7.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect8.cs b/FreeSql/Interface/Curd/ISelect/ISelect8.cs index 42165a52..39e0bf73 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect8.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect8.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Interface/Curd/ISelect/ISelect9.cs b/FreeSql/Interface/Curd/ISelect/ISelect9.cs index 884c089b..9af6de2f 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect9.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect9.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -9,6 +10,9 @@ namespace FreeSql { bool Any(Expression> exp); Task AnyAsync(Expression> exp); + DataTable ToDataTable(Expression> select); + Task ToDataTableAsync(Expression> select); + List ToList(Expression> select); Task> ToListAsync(Expression> select); string ToSql(Expression> select); diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index aa0b035a..a9516340 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -81,7 +81,9 @@ namespace FreeSql.Internal.CommonProvider { ++colidx; } sb.Append(") VALUES"); - _params = new DbParameter[colidx * _source.Count]; + //_params = new DbParameter[colidx * _source.Count]; + _params = new DbParameter[0]; + //_params = new DbParameter[colidx * 5]; //鎵归噺娣诲姞绗5琛岃捣锛屼笉浣跨敤鍙傛暟鍖 var didx = 0; foreach (var d in _source) { if (didx > 0) sb.Append(", "); @@ -90,14 +92,18 @@ namespace FreeSql.Internal.CommonProvider { foreach (var col in _table.Columns.Values) if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { if (colidx2 > 0) sb.Append(", "); - sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); object val = null; if (_table.Properties.TryGetValue(col.CsName, out var tryp)) { val = tryp.GetValue(d); if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?)) && (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId()); } - _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val); + //if (didx >= 5) + sb.Append(_commonUtils.GetNoneParamaterSqlValue(col.CsType, val)); + //else { + // sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); + // _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val); + //} ++colidx2; } sb.Append(")"); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index bcdc017e..8b7ec137 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -152,6 +152,21 @@ namespace FreeSql.Internal.CommonProvider { } public TSelect Take(int limit) => this.Limit(limit) as TSelect; + public DataTable ToDataTable(string field = null) { + var sql = this.ToSql(field); + if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; + + return _orm.Cache.Shell(_cache.key, _cache.seconds, () => + _orm.Ado.ExecuteDataTable(_transaction, CommandType.Text, sql, _params.ToArray())); + } + public Task ToDataTableAsync(string field = null) { + var sql = this.ToSql(field); + if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; + + return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, () => + _orm.Ado.ExecuteDataTableAsync(_transaction, CommandType.Text, sql, _params.ToArray())); + } + public List ToList(string field) { var sql = this.ToSql(field); if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; @@ -472,6 +487,9 @@ namespace FreeSql.Internal.CommonProvider { return this.ToSql(af.field); } + protected DataTable InternalToDataTable(Expression select) => _orm.Ado.ExecuteDataTable(_transaction, CommandType.Text, this.InternalToSql(select), _params.ToArray()); + protected Task InternalToDataTableAsync(Expression select) => _orm.Ado.ExecuteDataTableAsync(_transaction, CommandType.Text, this.InternalToSql(select), _params.ToArray()); + protected TReturn InternalToAggregate(Expression select) { var map = new ReadAnonymousTypeInfo(); var field = new StringBuilder(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 27cb26f3..e2da2629 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -51,6 +52,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index e7fb0af0..dee88c95 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -1,6 +1,7 @@ 锘縰sing FreeSql.Internal.Model; using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Linq.Expressions; using System.Text; @@ -99,6 +100,10 @@ namespace FreeSql.Internal.CommonProvider { public Task> ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + public DataTable ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + public Task ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + public string ToSql(Expression> select) => this.InternalToSql(select?.Body); public TReturn ToAggregate(Expression, TReturn>> select) => this.InternalToAggregate(select?.Body); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index 5c5aad42..dabdf416 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -44,6 +45,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index aab3891f..d3aab7ac 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -45,6 +46,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index 06eac465..5c22462b 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -46,6 +47,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index b88a7cbb..c7162446 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -47,6 +48,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 3c2ea28b..11f0c693 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -48,6 +49,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index e09a5f23..c190aeda 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -49,6 +50,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 6a1410b6..1b214054 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.Data; using System.Linq.Expressions; using System.Threading.Tasks; @@ -50,6 +51,10 @@ namespace FreeSql.Internal.CommonProvider { Task> ISelect.ToListAsync(Expression> select) => this.InternalToListAsync(select?.Body); + DataTable ISelect.ToDataTable(Expression> select) => this.InternalToDataTable(select?.Body); + + Task ISelect.ToDataTableAsync(Expression> select) => this.InternalToDataTableAsync(select?.Body); + string ISelect.ToSql(Expression> select) => this.InternalToSql(select?.Body); ISelect ISelect.Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambda(_tables, exp?.Body, null)); diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index df209a70..04375939 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -13,6 +13,7 @@ using System.Text; namespace FreeSql.Internal { internal abstract class CommonUtils { + internal abstract string GetNoneParamaterSqlValue(Type type, object value); internal abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); internal abstract DbParameter AppendParamter(List _params, string parameterName, Type type, object value); internal abstract string FormatSql(string sql, params object[] args); diff --git a/FreeSql/MySql/MySqlAdo/MySqlAdo.cs b/FreeSql/MySql/MySqlAdo/MySqlAdo.cs index 23a93b24..098dc8a4 100644 --- a/FreeSql/MySql/MySqlAdo/MySqlAdo.cs +++ b/FreeSql/MySql/MySqlAdo/MySqlAdo.cs @@ -31,19 +31,15 @@ namespace FreeSql.MySql { else if (param is string) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); else if (param is Enum) - return ((Enum)param).ToInt64(); + return string.Concat("'", param.ToString().Replace("'", "''"), "'"); //((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime) + else if (param is DateTime || param is DateTime?) return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - else if (param is DateTime?) - return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss"), "'"); - else if (param is TimeSpan) + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; - else if (param is TimeSpan?) - return (param as TimeSpan?).Value.Ticks / 10; else if (param is MygisGeometry) - return (param as MygisGeometry).AsText(); + return string.Concat("ST_GeomFromText('", (param as MygisGeometry).AsText().Replace("'", "''"), "')"); else if (param is IEnumerable) { var sb = new StringBuilder(); var ie = param as IEnumerable; diff --git a/FreeSql/MySql/MySqlUtils.cs b/FreeSql/MySql/MySqlUtils.cs index 58180b26..77955b57 100644 --- a/FreeSql/MySql/MySqlUtils.cs +++ b/FreeSql/MySql/MySqlUtils.cs @@ -4,6 +4,7 @@ using MySql.Data.MySqlClient; using System; using System.Collections.Generic; using System.Data.Common; +using System.Text; namespace FreeSql.MySql { @@ -70,6 +71,24 @@ namespace FreeSql.MySql { } return columnName; } + + internal override string GetNoneParamaterSqlValue(Type type, object value) { + if (value == null) return "NULL"; + if (type == typeof(byte[])) { + var bytes = value as byte[]; + var sb = new StringBuilder().Append("0x"); + foreach (var vc in bytes) { + if (vc < 10) sb.Append("0"); + sb.Append(vc.ToString("X")); + } + return sb.ToString(); //val = Encoding.UTF8.GetString(val as byte[]); + } else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { + var ts = (TimeSpan)value; + value = $"{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}"; + } + return FormatSql("{0}", value, 1); + } + internal override string DbName => "MySql"; } } diff --git a/FreeSql/Oracle/Curd/OracleInsert.cs b/FreeSql/Oracle/Curd/OracleInsert.cs index 40435c75..153cfef0 100644 --- a/FreeSql/Oracle/Curd/OracleInsert.cs +++ b/FreeSql/Oracle/Curd/OracleInsert.cs @@ -40,7 +40,9 @@ namespace FreeSql.Oracle.Curd { } sbtb.Append(") "); - _params = new DbParameter[colidx * _source.Count]; + //_params = new DbParameter[colidx * _source.Count]; + _params = new DbParameter[0]; + //_params = new DbParameter[colidx * 5]; //鎵归噺娣诲姞绗5琛岃捣锛屼笉浣跨敤鍙傛暟鍖 var didx = 0; foreach (var d in _source) { if (_source.Count > 1) sb.Append("\r\n"); @@ -51,21 +53,25 @@ namespace FreeSql.Oracle.Curd { foreach (var col in _table.Columns.Values) { if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { if (colidx2 > 0) sb.Append(", "); - sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); object val = null; if (_table.Properties.TryGetValue(col.CsName, out var tryp)) { val = tryp.GetValue(d); if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?)) && (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId()); } - _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val); + //if (didx >= 5) + sb.Append(_commonUtils.GetNoneParamaterSqlValue(col.CsType, val)); + //else { + // sb.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); + // _params[didx * colidx + colidx2] = _commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val); + //} ++colidx2; } } sb.Append(")"); ++didx; } - if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); + //if (_source.Count > 1) sb.Append("\r\n SELECT 1 FROM DUAL"); return sb.ToString(); } diff --git a/FreeSql/Oracle/OracleAdo/OracleAdo.cs b/FreeSql/Oracle/OracleAdo/OracleAdo.cs index 757b031e..7e92e622 100644 --- a/FreeSql/Oracle/OracleAdo/OracleAdo.cs +++ b/FreeSql/Oracle/OracleAdo/OracleAdo.cs @@ -34,14 +34,10 @@ namespace FreeSql.Oracle { return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime) - return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6)"); - else if (param is DateTime?) - return string.Concat("to_timestamp('", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6)"); - else if (param is TimeSpan) + else if (param is DateTime || param is DateTime?) + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; - else if (param is TimeSpan?) - return $"numtodsinterval({(param as TimeSpan?).Value.Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) { var sb = new StringBuilder(); var ie = param as IEnumerable; diff --git a/FreeSql/Oracle/OracleUtils.cs b/FreeSql/Oracle/OracleUtils.cs index 476bb45e..d58e348e 100644 --- a/FreeSql/Oracle/OracleUtils.cs +++ b/FreeSql/Oracle/OracleUtils.cs @@ -4,6 +4,7 @@ using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data.Common; +using System.Text; namespace FreeSql.Oracle { @@ -46,6 +47,21 @@ namespace FreeSql.Oracle { internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; internal override string QuoteReadColumn(Type type, string columnName) => columnName; + + internal override string GetNoneParamaterSqlValue(Type type, object value) { + if (value == null) return "NULL"; + if (type == typeof(byte[])) { + var bytes = value as byte[]; + var sb = new StringBuilder().Append("rawtohex('0x"); + foreach (var vc in bytes) { + if (vc < 10) sb.Append("0"); + sb.Append(vc.ToString("X")); + } + return sb.Append("')").ToString(); + } + return FormatSql("{0}", value, 1); + } + internal override string DbName => "Oracle"; } } diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index 8b86c595..cb22dbe3 100644 --- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -36,14 +36,10 @@ namespace FreeSql.PostgreSQL { return string.Concat("'", param.ToString().Replace("'", "''"), "'"); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime) + else if (param is DateTime || param is DateTime?) return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - else if (param is DateTime?) - return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); - else if (param is TimeSpan) + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; - else if (param is TimeSpan?) - return (param as TimeSpan?).Value.Ticks / 10; else if (param is JToken || param is JObject || param is JArray) return string.Concat("'", param.ToString().Replace("'", "''"), "'::jsonb"); else if ((isdic = param is Dictionary) || diff --git a/FreeSql/PostgreSQL/PostgreSQLUtils.cs b/FreeSql/PostgreSQL/PostgreSQLUtils.cs index d0d972e2..30d69c83 100644 --- a/FreeSql/PostgreSQL/PostgreSQLUtils.cs +++ b/FreeSql/PostgreSQL/PostgreSQLUtils.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Net; +using System.Text; namespace FreeSql.PostgreSQL { @@ -102,6 +103,26 @@ namespace FreeSql.PostgreSQL { internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; internal override string QuoteReadColumn(Type type, string columnName) => columnName; + + internal override string GetNoneParamaterSqlValue(Type type, object value) { + if (value == null) return "NULL"; + value = getParamterValue(type, value); + var type2 = value.GetType(); + if (type2 == typeof(byte[])) { + var bytes = value as byte[]; + var sb = new StringBuilder().Append("E'\\x"); + foreach (var vc in bytes) { + if (vc < 10) sb.Append("0"); + sb.Append(vc.ToString("X")); + } + return sb.Append("'").ToString(); //val = Encoding.UTF8.GetString(val as byte[]); + } else if (type2 == typeof(TimeSpan) || type2 == typeof(TimeSpan?)) { + var ts = (TimeSpan)value; + value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}"; + } + return FormatSql("{0}", value, 1); + } + internal override string DbName => "PostgreSQL"; } } diff --git a/FreeSql/SqlServer/Curd/SqlServerInsert.cs b/FreeSql/SqlServer/Curd/SqlServerInsert.cs index 4d8468c9..a7ce2b1f 100644 --- a/FreeSql/SqlServer/Curd/SqlServerInsert.cs +++ b/FreeSql/SqlServer/Curd/SqlServerInsert.cs @@ -1,9 +1,9 @@ 锘縰sing FreeSql.Internal; +using SafeObjectPool; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.Linq; using System.Text; using System.Threading.Tasks; @@ -14,267 +14,84 @@ namespace FreeSql.SqlServer.Curd { : base(orm, commonUtils, commonExpression) { } - public override int ExecuteAffrows() { - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return 0; - case 1: return _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2); - default: - var affrows = 0; - if (_transaction == null) { - using (var conn = _orm.Ado.MasterPool.Get()) { - var tran = conn.Value.BeginTransaction(); - try { - foreach (var s in sql) - affrows += _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2); - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - foreach (var s in sql) - affrows += _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2); - } - return affrows; - } - } - async public override Task ExecuteAffrowsAsync() { - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return 0; - case 1: return await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2); - default: - var affrows = 0; - if (_transaction == null) { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) { - var tran = conn.Value.BeginTransaction(); - try { - foreach (var s in sql) - affrows += await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2); - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - foreach (var s in sql) - affrows += await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2); - } - return affrows; - } - } - public override long ExecuteIdentity() { - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return 0; - case 1: - if (string.IsNullOrEmpty(sql[0].Item1)) return 0; - return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0; - default: - long ret = 0; - if (_transaction == null) { - using (var conn = _orm.Ado.MasterPool.Get()) { - var tran = conn.Value.BeginTransaction(); - try { - for (var a = 0; a < sql.Count; a++) { - var s = sql[a]; - if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2); - else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; - } - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - for (var a = 0; a < sql.Count; a++) { - var s = sql[a]; - if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2); - else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; - } - } - return ret; - } + //if (_source?.Count > 999) { + // List> inserts = new List>(); + // var idx = 0; + // while (idx < _source.Count) { + // var count = Math.Min(_source.Count, idx + 999) - idx; + // var insert = _orm.Insert().AppendData(_source.GetRange(idx, count)); + // _ + // inserts.Add(insert); + // idx += 999; + // } + // Object conn = null; + // var trans = _transaction; + // if (_transaction == null) { + // conn = _orm.Ado.MasterPool.Get(); + // trans = conn.Value.BeginTransaction(); + // } + // try { + // for (var a = 0; a < inserts.Count; a++) { + // inserts[a].WithTransaction(trans) + // } + // if (_transaction == null) trans.Commit(); + // } catch { + // if (_transaction == null) trans.Rollback(); + // throw; + // } + //} + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; } async public override Task ExecuteIdentityAsync() { - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return 0; - case 1: - if (string.IsNullOrEmpty(sql[0].Item1)) return 0; - return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0; - default: - long ret = 0; - if (_transaction == null) { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) { - var tran = conn.Value.BeginTransaction(); - try { - for (var a = 0; a < sql.Count; a++) { - var s = sql[a]; - if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2); - else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; - } - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - for (var a = 0; a < sql.Count; a++) { - var s = sql[a]; - if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2); - else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; - } - } - return ret; - } + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return 0; + + return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql, "; SELECT SCOPE_IDENTITY();"), _params)), out var trylng) ? trylng : 0; } public override List ExecuteInserted() { - string output = null; - Func getOutputSql = oldsql => { - if (string.IsNullOrEmpty(output)) { - var sb = new StringBuilder(); - sb.Append(" OUTPUT "); - var colidx = 0; - foreach (var col in _table.Columns.Values) { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - output = sb.ToString(); - } - var validx = oldsql.IndexOf(") VALUES"); - if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); - var newsql = new StringBuilder().Append(output); - newsql.Insert(0, oldsql.Substring(0, validx + 1)); - newsql.Append(oldsql.Substring(validx + 1)); - return newsql.ToString(); - }; + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return new List(); - case 1: - if (string.IsNullOrEmpty(sql[0].Item1)) return new List(); - return _orm.Ado.Query(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2); - default: - var ret = new List(); - if (_transaction == null) { - using (var conn = _orm.Ado.MasterPool.Get()) { - var tran = conn.Value.BeginTransaction(); - try { - foreach (var s in sql) - ret.AddRange(_orm.Ado.Query(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2)); - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - foreach (var s in sql) - ret.AddRange(_orm.Ado.Query(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2)); - } - return ret; + var sb = new StringBuilder(); + sb.Append(" OUTPUT "); + var colidx = 0; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; } + + var validx = sql.IndexOf(") VALUES"); + if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); + sb.Insert(0, sql.Substring(0, validx + 1)); + sb.Append(sql.Substring(validx + 1)); + + return _orm.Ado.Query(_transaction, CommandType.Text, sb.ToString(), _params); } async public override Task> ExecuteInsertedAsync() { - string output = null; - Func getOutputSql = oldsql => { - if (string.IsNullOrEmpty(output)) { - var sb = new StringBuilder(); - sb.Append(" OUTPUT "); - var colidx = 0; - foreach (var col in _table.Columns.Values) { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - output = sb.ToString(); - } - var validx = oldsql.IndexOf(") VALUES"); - if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); - var newsql = new StringBuilder().Append(output); - newsql.Insert(0, oldsql.Substring(0, validx + 1)); - newsql.Append(oldsql.Substring(validx + 1)); - return oldsql; - }; + var sql = this.ToSql(); + if (string.IsNullOrEmpty(sql)) return new List(); - var sql = this.ToSql2100(); - switch (sql.Count) { - case 0: return new List(); - case 1: - if (string.IsNullOrEmpty(sql[0].Item1)) return new List(); - return await _orm.Ado.QueryAsync(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2); - default: - var ret = new List(); - if (_transaction == null) { - using (var conn = await _orm.Ado.MasterPool.GetAsync()) { - var tran = conn.Value.BeginTransaction(); - try { - foreach (var s in sql) - ret.AddRange(await _orm.Ado.QueryAsync(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2)); - tran.Commit(); - } catch { - tran.Rollback(); - } - } - } else { - foreach (var s in sql) - ret.AddRange(await _orm.Ado.QueryAsync(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2)); - } - return ret; - } - } - - public List<(string, DbParameter[])> ToSql2100() { //浼犲叆鐨勮姹傚叿鏈夎繃澶氱殑鍙傛暟銆傝鏈嶅姟鍣ㄦ敮鎸佹渶澶 2100 涓弬鏁般傝鍑忓皯鍙傛暟鐨勬暟鐩紝鐒跺悗閲嶆柊鍙戦佽璇锋眰銆 - if (_source == null || _source.Any() == false) return new List<(string, DbParameter[])>(); - var ret = new List<(string, DbParameter[])>(); - var sbhead = new StringBuilder(); - sbhead.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(_tableRule?.Invoke(_table.DbName) ?? _table.DbName)).Append("("); + var sb = new StringBuilder(); + sb.Append(" OUTPUT "); var colidx = 0; - foreach (var col in _table.Columns.Values) - if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { - if (colidx > 0) sbhead.Append(", "); - sbhead.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)); - ++colidx; - } - sbhead.Append(") VALUES"); - var sbh = sbhead.ToString(); - - var sbsql = new StringBuilder().Append(sbh); - var sbsqlParams = new List(); - var didx = 0; - foreach (var d in _source) { - if ((didx + 1) * colidx >= 2100) { - ret.Add((sbsql.ToString(), sbsqlParams.ToArray())); - sbsql.Clear().Append(sbh); - sbsqlParams.Clear(); - } - - if (sbsqlParams.Count > 0) sbsql.Append(", "); - sbsql.Append("("); - var colidx2 = 0; - foreach (var col in _table.Columns.Values) - if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { - if (colidx2 > 0) sbsql.Append(", "); - sbsql.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); - object val = null; - if (_table.Properties.TryGetValue(col.CsName, out var tryp)) { - val = tryp.GetValue(d); - if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?)) - && (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId()); - } - sbsqlParams.Add(_commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val)); - ++colidx2; - } - sbsql.Append(")"); - ++didx; + foreach (var col in _table.Columns.Values) { + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + ++colidx; } - ret.Add((sbsql.ToString(), sbsqlParams.ToArray())); - return ret; + + var validx = sql.IndexOf(") VALUES"); + if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); + sb.Insert(0, sql.Substring(0, validx + 1)); + sb.Append(sql.Substring(validx + 1)); + + return await _orm.Ado.QueryAsync(_transaction, CommandType.Text, sb.ToString(), _params); } } -} +} \ No newline at end of file diff --git a/FreeSql/SqlServer/Curd/SqlServerInsert2100.cs b/FreeSql/SqlServer/Curd/SqlServerInsert2100.cs new file mode 100644 index 00000000..2d129b81 --- /dev/null +++ b/FreeSql/SqlServer/Curd/SqlServerInsert2100.cs @@ -0,0 +1,281 @@ +锘//using FreeSql.Internal; +//using System; +//using System.Collections.Generic; +//using System.Data; +//using System.Data.Common; +//using System.Linq; +//using System.Text; +//using System.Threading.Tasks; + +//namespace FreeSql.SqlServer.Curd { + +// class SqlServerInsert : Internal.CommonProvider.InsertProvider where T1 : class { +// public SqlServerInsert(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) +// : base(orm, commonUtils, commonExpression) { +// } + +// public override int ExecuteAffrows() { +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return 0; +// case 1: return _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2); +// default: +// var affrows = 0; +// if (_transaction == null) { +// using (var conn = _orm.Ado.MasterPool.Get()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// foreach (var s in sql) +// affrows += _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2); +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// foreach (var s in sql) +// affrows += _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2); +// } +// return affrows; +// } +// } +// async public override Task ExecuteAffrowsAsync() { +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return 0; +// case 1: return await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, sql[0].Item1, sql[0].Item2); +// default: +// var affrows = 0; +// if (_transaction == null) { +// using (var conn = await _orm.Ado.MasterPool.GetAsync()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// foreach (var s in sql) +// affrows += await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2); +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// foreach (var s in sql) +// affrows += await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2); +// } +// return affrows; +// } +// } + +// public override long ExecuteIdentity() { +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return 0; +// case 1: +// if (string.IsNullOrEmpty(sql[0].Item1)) return 0; +// return long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0; +// default: +// long ret = 0; +// if (_transaction == null) { +// using (var conn = _orm.Ado.MasterPool.Get()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// for (var a = 0; a < sql.Count; a++) { +// var s = sql[a]; +// if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(tran, CommandType.Text, s.Item1, s.Item2); +// else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; +// } +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// for (var a = 0; a < sql.Count; a++) { +// var s = sql[a]; +// if (a < sql.Count - 1) _orm.Ado.ExecuteNonQuery(_transaction, CommandType.Text, s.Item1, s.Item2); +// else ret = long.TryParse(string.Concat(_orm.Ado.ExecuteScalar(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; +// } +// } +// return ret; +// } +// } +// async public override Task ExecuteIdentityAsync() { +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return 0; +// case 1: +// if (string.IsNullOrEmpty(sql[0].Item1)) return 0; +// return long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(sql[0].Item1, "; SELECT SCOPE_IDENTITY();"), sql[0].Item2)), out var trylng) ? trylng : 0; +// default: +// long ret = 0; +// if (_transaction == null) { +// using (var conn = await _orm.Ado.MasterPool.GetAsync()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// for (var a = 0; a < sql.Count; a++) { +// var s = sql[a]; +// if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(tran, CommandType.Text, s.Item1, s.Item2); +// else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(tran, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; +// } +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// for (var a = 0; a < sql.Count; a++) { +// var s = sql[a]; +// if (a < sql.Count - 1) await _orm.Ado.ExecuteNonQueryAsync(_transaction, CommandType.Text, s.Item1, s.Item2); +// else ret = long.TryParse(string.Concat(await _orm.Ado.ExecuteScalarAsync(_transaction, CommandType.Text, string.Concat(s.Item1, "; SELECT SCOPE_IDENTITY();"), s.Item2)), out trylng) ? trylng : 0; +// } +// } +// return ret; +// } +// } + +// public override List ExecuteInserted() { +// string output = null; +// Func getOutputSql = oldsql => { +// if (string.IsNullOrEmpty(output)) { +// var sb = new StringBuilder(); +// sb.Append(" OUTPUT "); +// var colidx = 0; +// foreach (var col in _table.Columns.Values) { +// if (colidx > 0) sb.Append(", "); +// sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); +// ++colidx; +// } +// output = sb.ToString(); +// } +// var validx = oldsql.IndexOf(") VALUES"); +// if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); +// var newsql = new StringBuilder().Append(output); +// newsql.Insert(0, oldsql.Substring(0, validx + 1)); +// newsql.Append(oldsql.Substring(validx + 1)); +// return newsql.ToString(); +// }; + +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return new List(); +// case 1: +// if (string.IsNullOrEmpty(sql[0].Item1)) return new List(); +// return _orm.Ado.Query(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2); +// default: +// var ret = new List(); +// if (_transaction == null) { +// using (var conn = _orm.Ado.MasterPool.Get()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// foreach (var s in sql) +// ret.AddRange(_orm.Ado.Query(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2)); +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// foreach (var s in sql) +// ret.AddRange(_orm.Ado.Query(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2)); +// } +// return ret; +// } +// } +// async public override Task> ExecuteInsertedAsync() { +// string output = null; +// Func getOutputSql = oldsql => { +// if (string.IsNullOrEmpty(output)) { +// var sb = new StringBuilder(); +// sb.Append(" OUTPUT "); +// var colidx = 0; +// foreach (var col in _table.Columns.Values) { +// if (colidx > 0) sb.Append(", "); +// sb.Append(_commonUtils.QuoteReadColumn(col.CsType, $"INSERTED.{_commonUtils.QuoteSqlName(col.Attribute.Name)}")).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); +// ++colidx; +// } +// output = sb.ToString(); +// } +// var validx = oldsql.IndexOf(") VALUES"); +// if (validx == -1) throw new ArgumentException("鎵句笉鍒 VALUES"); +// var newsql = new StringBuilder().Append(output); +// newsql.Insert(0, oldsql.Substring(0, validx + 1)); +// newsql.Append(oldsql.Substring(validx + 1)); +// return oldsql; +// }; + +// var sql = this.ToSql2100(); +// switch (sql.Count) { +// case 0: return new List(); +// case 1: +// if (string.IsNullOrEmpty(sql[0].Item1)) return new List(); +// return await _orm.Ado.QueryAsync(_transaction, CommandType.Text, getOutputSql(sql[0].Item1), sql[0].Item2); +// default: +// var ret = new List(); +// if (_transaction == null) { +// using (var conn = await _orm.Ado.MasterPool.GetAsync()) { +// var tran = conn.Value.BeginTransaction(); +// try { +// foreach (var s in sql) +// ret.AddRange(await _orm.Ado.QueryAsync(tran, CommandType.Text, getOutputSql(s.Item1), s.Item2)); +// tran.Commit(); +// } catch { +// tran.Rollback(); +// } +// } +// } else { +// foreach (var s in sql) +// ret.AddRange(await _orm.Ado.QueryAsync(_transaction, CommandType.Text, getOutputSql(s.Item1), s.Item2)); +// } +// return ret; +// } +// } + +// public List<(string, DbParameter[])> ToSql2100() { //浼犲叆鐨勮姹傚叿鏈夎繃澶氱殑鍙傛暟銆傝鏈嶅姟鍣ㄦ敮鎸佹渶澶 2100 涓弬鏁般傝鍑忓皯鍙傛暟鐨勬暟鐩紝鐒跺悗閲嶆柊鍙戦佽璇锋眰銆 +// if (_source == null || _source.Any() == false) return new List<(string, DbParameter[])>(); +// var ret = new List<(string, DbParameter[])>(); +// var sbhead = new StringBuilder(); +// sbhead.Append("INSERT INTO ").Append(_commonUtils.QuoteSqlName(_tableRule?.Invoke(_table.DbName) ?? _table.DbName)).Append("("); +// var colidx = 0; +// foreach (var col in _table.Columns.Values) +// if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { +// if (colidx > 0) sbhead.Append(", "); +// sbhead.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)); +// ++colidx; +// } +// sbhead.Append(") VALUES"); +// var sbh = sbhead.ToString(); + +// var sbsql = new StringBuilder().Append(sbh); +// var sbsqlParams = new List(); +// var didx = 0; +// foreach (var d in _source) { +// if ((didx + 1) * colidx >= 2100) { +// ret.Add((sbsql.ToString(), sbsqlParams.ToArray())); +// sbsql.Clear().Append(sbh); +// sbsqlParams.Clear(); +// didx = 0; +// } + +// if (sbsqlParams.Count > 0) sbsql.Append(", "); +// sbsql.Append("("); +// var colidx2 = 0; +// foreach (var col in _table.Columns.Values) +// if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name) == false) { +// if (colidx2 > 0) sbsql.Append(", "); +// sbsql.Append(_commonUtils.QuoteWriteParamter(col.CsType, $"{_commonUtils.QuoteParamterName(col.CsName)}{didx}")); +// object val = null; +// if (_table.Properties.TryGetValue(col.CsName, out var tryp)) { +// val = tryp.GetValue(d); +// if (col.Attribute.IsPrimary && (col.CsType == typeof(Guid) || col.CsType == typeof(Guid?)) +// && (val == null || (Guid)val == Guid.Empty)) tryp.SetValue(d, val = FreeUtil.NewMongodbId()); +// } +// sbsqlParams.Add(_commonUtils.AppendParamter(null, $"{col.CsName}{didx}", col.CsType, val)); +// ++colidx2; +// } +// sbsql.Append(")"); +// ++didx; +// } +// ret.Add((sbsql.ToString(), sbsqlParams.ToArray())); +// return ret; +// } +// } +//} diff --git a/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs b/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs index 6979f837..60910d3c 100644 --- a/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -28,18 +28,21 @@ namespace FreeSql.SqlServer { if (param == null) return "NULL"; if (param is bool || param is bool?) return (bool)param ? 1 : 0; - else if (param is string || param is Enum) + else if (param is string) return string.Concat("'", param.ToString().Replace("'", "''"), "'"); + else if (param is Enum) + return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime) + else if (param is DateTime || param is DateTime?) { + if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - else if (param is DateTime?) - return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); - else if (param is TimeSpan) + } else if (param is DateTimeOffset || param is DateTimeOffset?) { + if (param.Equals(DateTimeOffset.MinValue) == true) param = new DateTimeOffset(new DateTime(1970, 1, 1), TimeSpan.Zero); + return string.Concat("'", ((DateTimeOffset)param).ToString("yyyy-MM-dd HH:mm:ss.fff zzzz"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; - else if (param is TimeSpan?) - return (param as TimeSpan?).Value.TotalSeconds; else if (param is IEnumerable) { var sb = new StringBuilder(); var ie = param as IEnumerable; diff --git a/FreeSql/SqlServer/SqlServerUtils.cs b/FreeSql/SqlServer/SqlServerUtils.cs index 7ea45b84..f4601100 100644 --- a/FreeSql/SqlServer/SqlServerUtils.cs +++ b/FreeSql/SqlServer/SqlServerUtils.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SqlClient; +using System.Linq; +using System.Text; namespace FreeSql.SqlServer { @@ -42,6 +44,24 @@ namespace FreeSql.SqlServer { internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; internal override string QuoteReadColumn(Type type, string columnName) => columnName; + + internal override string GetNoneParamaterSqlValue(Type type, object value) { + if (value == null) return "NULL"; + if (type == typeof(byte[])) { + var bytes = value as byte[]; + var sb = new StringBuilder().Append("0x"); + foreach (var vc in bytes) { + if (vc < 10) sb.Append("0"); + sb.Append(vc.ToString("X")); + } + return sb.ToString(); + } else if (type == typeof(TimeSpan) || type == typeof(TimeSpan?)) { + var ts = (TimeSpan)value; + value = $"{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}"; + } + return FormatSql("{0}", value, 1); + } + internal override string DbName => "SqlServer"; } } diff --git a/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs b/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs index 7a2ab09f..9718cae7 100644 --- a/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs +++ b/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs @@ -34,16 +34,10 @@ namespace FreeSql.Sqlite { return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime) + else if (param is DateTime || param is DateTime?) return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); - else if (param is DateTime?) - return string.Concat("'", (param as DateTime?).Value.ToString("yyyy-MM-dd HH:mm:ss"), "'"); - else if (param is TimeSpan) + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10000; - else if (param is TimeSpan?) - return (param as TimeSpan?).Value.Ticks / 10000; - else if (param is MygisGeometry) - return (param as MygisGeometry).AsText(); else if (param is IEnumerable) { var sb = new StringBuilder(); var ie = param as IEnumerable; diff --git a/FreeSql/Sqlite/SqliteUtils.cs b/FreeSql/Sqlite/SqliteUtils.cs index 6644d130..44dfc66f 100644 --- a/FreeSql/Sqlite/SqliteUtils.cs +++ b/FreeSql/Sqlite/SqliteUtils.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SQLite; +using System.Text; namespace FreeSql.Sqlite { @@ -61,6 +62,13 @@ namespace FreeSql.Sqlite { internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; internal override string QuoteReadColumn(Type type, string columnName) => columnName; + + internal override string GetNoneParamaterSqlValue(Type type, object value) { + if (value == null) return "NULL"; + if (type == typeof(byte[])) value = Encoding.UTF8.GetString(value as byte[]); + return FormatSql("{0}", value, 1); + } + internal override string DbName => "Sqlite"; } }