From bdeb264fe9cf483cec714fd5f6c3f3959cf064df Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 28 Mar 2025 14:00:24 +0800 Subject: [PATCH 1/3] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20MySql8.0.30=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=20ExecuteInserted=20?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B#2001?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 9 ++ FreeSql.DbContext/FreeSql.DbContext.xml | 8 ++ .../CommonProvider/AdoProvider/AdoProvider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 14 +- .../CommonProvider/UpdateProviderAsync.cs | 15 +- .../MySql/Curd/CustomMySqlInsert.cs | 54 +++---- .../MySql/Curd/CustomMySqlUpdate.cs | 94 +++++++----- .../Curd/MySqlInsert.cs | 54 +++---- .../Curd/MySqlUpdate.cs | 48 +++++-- .../MySql/Curd/OdbcMySqlInsert.cs | 54 +++---- .../MySql/Curd/OdbcMySqlUpdate.cs | 136 +++++++++++------- 11 files changed, 287 insertions(+), 201 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 7f38c8d4a..13ef61d3d 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -621,7 +621,16 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Insert(new List + { + new User1 { Nickname = "nickname11", Username = "username11", Description = "desc11" }, + new User1 { Nickname = "n2", Username = "u2", Description = "d2" }, + new User1 { Nickname = "n3", Username = "u3", Description = "d3" }, + }).ExecuteAffrows(); + fsql.Insert(new User1()).ExecuteInserted(); + fsql.Update().SetSource(new User1()).ExecuteUpdated(); fsql.InsertOrUpdate().SetSource(new AppInfoEntity { AppID = "03DN8CW8", AppName = "app_01" }).ExecuteAffrows(); var repo2211 = fsql.GetRepository(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index a7a94fcda..c941a15d9 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -758,5 +758,13 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 8a0b0d2e6..84ca94b41 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -92,7 +92,7 @@ namespace FreeSql.Internal.CommonProvider } } - internal Dictionary GetQueryTypeProperties(Type type) + public static Dictionary GetQueryTypeProperties(Type type) { return type.GetPropertiesDictIgnoreCase(); //与 ExecuteArrayRowReadClassOrTuple 顺序同步,防止【延时属性】获取到位置不对的问题 //var tb = _util.GetTableByEntity(type); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 66d3fe650..71fd55997 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -8,6 +8,7 @@ using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider @@ -476,13 +477,20 @@ namespace FreeSql.Internal.CommonProvider public abstract int ExecuteAffrows(); protected abstract List ExecuteUpdated(IEnumerable columns); - public List ExecuteUpdated() => ExecuteUpdated(_table.ColumnsByPosition); + public List ExecuteUpdated() + { + var ret = ExecuteUpdated(_table.Columns.Values); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } public List ExecuteUpdated(Expression> returnColumns) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null) .Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray(); - return ExecuteUpdated(cols); - } + var ret = ExecuteUpdated(cols); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } public IUpdate IgnoreColumns(Expression> columns) => IgnoreColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null)); public IUpdate UpdateColumns(Expression> columns) => UpdateColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null)); diff --git a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs index 45bc2f898..4f999d309 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs @@ -143,13 +143,20 @@ namespace FreeSql.Internal.CommonProvider public abstract Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default); protected abstract Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default); - public Task> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) => ExecuteUpdatedAsync(_table.ColumnsByPosition, cancellationToken); - public Task> ExecuteUpdatedAsync(Expression> returnColumns, CancellationToken cancellationToken = default) + async public Task> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) + { + var ret = await ExecuteUpdatedAsync(_table.ColumnsByPosition, cancellationToken); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } + async public Task> ExecuteUpdatedAsync(Expression> returnColumns, CancellationToken cancellationToken = default) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null) .Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray(); - return ExecuteUpdatedAsync(cols, cancellationToken); - } + var ret = await ExecuteUpdatedAsync(cols, cancellationToken); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } #endif } } diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs index a6902fbec..fc5197df2 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs @@ -1,10 +1,12 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -89,24 +91,18 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -185,24 +181,18 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs index 65929f1c0..1dcdecb5b 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,35 +36,48 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - ToSqlFetch(sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + ToSqlFetch(sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw; @@ -125,6 +139,9 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -134,12 +151,19 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -147,10 +171,14 @@ namespace FreeSql.Custom.MySql Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index 33e358e92..d826397e2 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -1,9 +1,11 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -77,24 +79,18 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); //与 ExecuteArrayRowReadClassOrTuple 顺序同步 - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -162,24 +158,18 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index cee1e9ef3..1b587db9c 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,6 +36,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -44,12 +48,19 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -58,8 +69,11 @@ namespace FreeSql.MySql.Curd Exception exception = null; try { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } @@ -125,6 +139,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -134,12 +151,19 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -147,10 +171,14 @@ namespace FreeSql.MySql.Curd Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs index 703071dbd..fa552338b 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs @@ -1,10 +1,12 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -89,24 +91,18 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -185,24 +181,18 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs index a34e97dc4..8b9a496eb 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,35 +36,48 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - ToSqlFetch(sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + ToSqlFetch(sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw; @@ -125,35 +139,49 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - await ToSqlFetchAsync(async sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + await ToSqlFetchAsync(async sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw; From 1fcda96b5b9bec5ab46a3e7950efd393ae3ed15c Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 28 Mar 2025 18:32:04 +0800 Subject: [PATCH 2/3] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20MySql8.0.30=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=20ExecuteInserted/ExecuteU?= =?UTF-8?q?pdated/ExecuteDeleted=20=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B#20?= =?UTF-8?q?01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MySql/Curd/CustomMySqlDelete.cs | 41 +++++++++++-- .../MySql/Curd/CustomMySqlInsert.cs | 10 ++-- .../MySql/Curd/CustomMySqlUpdate.cs | 4 +- .../Curd/MySqlDelete.cs | 53 +++++++++++------ .../Curd/MySqlInsert.cs | 10 ++-- .../Curd/MySqlUpdate.cs | 4 +- .../MySql/Curd/OdbcMySqlDelete.cs | 57 +++++++++++++------ .../MySql/Curd/OdbcMySqlInsert.cs | 10 ++-- .../MySql/Curd/OdbcMySqlUpdate.cs | 4 +- 9 files changed, 135 insertions(+), 58 deletions(-) diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs index 90e4f2044..7e6b4df9a 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs @@ -1,8 +1,10 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -22,6 +24,9 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -31,21 +36,31 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); } catch (Exception ex) { @@ -73,6 +88,9 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -82,21 +100,32 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); } catch (Exception ex) { diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs index fc5197df2..db524172a 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs @@ -102,7 +102,8 @@ namespace FreeSql.Custom.MySql dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -113,7 +114,7 @@ namespace FreeSql.Custom.MySql { _orm.Ado.ExecuteReader(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); }, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) @@ -192,7 +193,8 @@ namespace FreeSql.Custom.MySql dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -203,7 +205,7 @@ namespace FreeSql.Custom.MySql { await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); return Task.FromResult(false); }, CommandType.Text, sql, _commandTimeout, _params); } diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs index 1dcdecb5b..7d85d527b 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs @@ -52,7 +52,7 @@ namespace FreeSql.Custom.MySql var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); @@ -155,7 +155,7 @@ namespace FreeSql.Custom.MySql var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs index 43f48c993..b83ce2cba 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs @@ -1,8 +1,10 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -22,6 +24,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -31,21 +36,31 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); } catch (Exception ex) { @@ -58,11 +73,7 @@ namespace FreeSql.MySql.Curd _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - if (dbParms != null) - { - this.ClearData(); - sbret.Clear(); - } + sbret?.Clear(); return ret; } @@ -73,6 +84,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -82,21 +96,32 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); } catch (Exception ex) { @@ -109,11 +134,7 @@ namespace FreeSql.MySql.Curd _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - if (dbParms != null) - { - this.ClearData(); - sbret.Clear(); - } + sbret?.Clear(); return ret; } #endif diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index d826397e2..634fb541b 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -90,7 +90,8 @@ namespace FreeSql.MySql.Curd dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -101,7 +102,7 @@ namespace FreeSql.MySql.Curd { _orm.Ado.ExecuteReader(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); }, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) @@ -169,7 +170,8 @@ namespace FreeSql.MySql.Curd dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -180,7 +182,7 @@ namespace FreeSql.MySql.Curd { await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); return Task.FromResult(false); }, CommandType.Text, sql, _commandTimeout, _params); } diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index 1b587db9c..2d63a1244 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -52,7 +52,7 @@ namespace FreeSql.MySql.Curd var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); @@ -155,7 +155,7 @@ namespace FreeSql.MySql.Curd var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs index fdf91e47a..20dda3188 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs @@ -1,8 +1,10 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -22,6 +24,9 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -31,26 +36,36 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); } catch (Exception ex) { exception = ex; - throw ex; + throw; } finally { @@ -58,11 +73,7 @@ namespace FreeSql.Odbc.MySql _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - if (dbParms != null) - { - this.ClearData(); - sbret.Clear(); - } + sbret?.Clear(); return ret; } @@ -73,6 +84,9 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = _table.TypeLazy ?? _table.Type; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -82,26 +96,37 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); } catch (Exception ex) { exception = ex; - throw ex; + throw; } finally { @@ -109,11 +134,7 @@ namespace FreeSql.Odbc.MySql _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - if (dbParms != null) - { - this.ClearData(); - sbret.Clear(); - } + sbret?.Clear(); return ret; } #endif diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs index fa552338b..53f59dfd4 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs @@ -102,7 +102,8 @@ namespace FreeSql.Odbc.MySql dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -113,7 +114,7 @@ namespace FreeSql.Odbc.MySql { _orm.Ado.ExecuteReader(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); }, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) @@ -192,7 +193,8 @@ namespace FreeSql.Odbc.MySql dic.Add(col.CsName, colidx); ++colidx; } - var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + var queryType = _table.TypeLazy ?? _table.Type; + var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -203,7 +205,7 @@ namespace FreeSql.Odbc.MySql { await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils)); + ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); return Task.FromResult(false); }, CommandType.Text, sql, _commandTimeout, _params); } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs index 8b9a496eb..f08cf6814 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs @@ -52,7 +52,7 @@ namespace FreeSql.Odbc.MySql var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); @@ -155,7 +155,7 @@ namespace FreeSql.Odbc.MySql var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sb.Append(", "); + if (colidx > 0) sbret.Append(", "); sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); if (dic.ContainsKey(col.CsName)) continue; sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); From 66d94d0a88f132fa6613f6d68413f3efe6adbc5c Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 31 Mar 2025 16:51:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?-=20=E6=81=A2=E5=A4=8D=20MySql8.0.30=20Exec?= =?UTF-8?q?uteInserted/ExecuteUpdated/ExecuteDeleted=20=E7=9A=84=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=94=B9=E5=8A=A8=EF=BC=9B#2001?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Interface/Curd/IDelete.cs | 5 + FreeSql/Interface/Curd/IInsert.cs | 4 +- FreeSql/Interface/Curd/IUpdate.cs | 10 +- .../MySql/Curd/CustomMySqlDelete.cs | 43 ++----- .../MySql/Curd/CustomMySqlInsert.cs | 31 +---- .../MySql/Curd/CustomMySqlUpdate.cs | 83 +++++-------- .../Curd/MySqlDelete.cs | 51 +++----- .../Curd/MySqlInsert.cs | 31 +---- .../Curd/MySqlUpdate.cs | 51 ++------ .../MySql/Curd/OdbcMySqlDelete.cs | 51 +++----- .../MySql/Curd/OdbcMySqlInsert.cs | 31 +---- .../MySql/Curd/OdbcMySqlUpdate.cs | 115 +++++++----------- 12 files changed, 148 insertions(+), 358 deletions(-) diff --git a/FreeSql/Interface/Curd/IDelete.cs b/FreeSql/Interface/Curd/IDelete.cs index 6f78b31f7..ec8f21263 100644 --- a/FreeSql/Interface/Curd/IDelete.cs +++ b/FreeSql/Interface/Curd/IDelete.cs @@ -133,6 +133,11 @@ namespace FreeSql #if net40 #else Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default); + /// + /// 执行SQL语句,返回被删除的记录 + /// 注意:此方法只有 Postgresql/SqlServer/Maridb/Firebird/人大金仓 有效果 + /// + /// Task> ExecuteDeletedAsync(CancellationToken cancellationToken = default); #endif } diff --git a/FreeSql/Interface/Curd/IInsert.cs b/FreeSql/Interface/Curd/IInsert.cs index 0b3be6998..0ecee4b97 100644 --- a/FreeSql/Interface/Curd/IInsert.cs +++ b/FreeSql/Interface/Curd/IInsert.cs @@ -156,7 +156,7 @@ namespace FreeSql long ExecuteIdentity(); /// /// 执行SQL语句,返回插入后的记录 - /// 注意:此方法只有 Postgresql/SqlServer/MySql8.0.30+/Maridb/Firebird/DuckDB/人大金仓 有效果 + /// 注意:此方法只有 Postgresql/SqlServer/Maridb/Firebird/DuckDB/人大金仓 有效果 /// /// List ExecuteInserted(); @@ -176,7 +176,7 @@ namespace FreeSql Task ExecuteIdentityAsync(CancellationToken cancellationToken = default); /// /// 执行SQL语句,返回插入后的记录 - /// 注意:此方法只有 Postgresql/SqlServer/MySql8.0.30+/Maridb/Firebird/DuckDB/人大金仓 有效果 + /// 注意:此方法只有 Postgresql/SqlServer/Maridb/Firebird/DuckDB/人大金仓 有效果 /// /// Task> ExecuteInsertedAsync(CancellationToken cancellationToken = default); diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index b52893959..70e6d8135 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -303,11 +303,11 @@ namespace FreeSql #if net40 #else Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default); - /// - /// 执行SQL语句,返回更新后的记录 - /// 注意:此方法只有 Postgresql/SqlServer 有效果 - /// - /// + /// + /// 执行SQL语句,返回更新后的记录 + /// 注意:此方法只有 Postgresql/SqlServer/Maridb/Firebird/人大金仓 有效果 + /// + /// Task> ExecuteUpdatedAsync(CancellationToken cancellationToken = default); Task> ExecuteUpdatedAsync(Expression> returnColumns, CancellationToken cancellationToken = default); #endif diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs index 7e6b4df9a..6645c100c 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlDelete.cs @@ -24,9 +24,6 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -36,36 +33,26 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); + ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); } catch (Exception ex) { exception = ex; - throw ex; + throw; } finally { @@ -88,9 +75,6 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -100,37 +84,26 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); } catch (Exception ex) { exception = ex; - throw ex; + throw; } finally { diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs index db524172a..505ada97c 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs @@ -91,20 +91,12 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -112,10 +104,7 @@ namespace FreeSql.Custom.MySql Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = _orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) { @@ -182,20 +171,12 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -203,11 +184,7 @@ namespace FreeSql.Custom.MySql Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken); } catch (Exception ex) { diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs index 7d85d527b..53e436521 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs @@ -31,14 +31,11 @@ namespace FreeSql.Custom.MySql public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); protected override List ExecuteUpdated(IEnumerable columns) => base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); - protected override List RawExecuteUpdated(IEnumerable columns) - { - var ret = new List(); - DbParameter[] dbParms = null; - StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; + protected override List RawExecuteUpdated(IEnumerable columns) + { + var ret = new List(); + DbParameter[] dbParms = null; + StringBuilder sbret = null; ToSqlFetch(sb => { if (dbParms == null) @@ -48,19 +45,12 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -69,30 +59,27 @@ namespace FreeSql.Custom.MySql Exception exception = null; try { - var rettmp = new List(); - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) - { - exception = ex; - throw; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfterHandler?.Invoke(this, after); - } - }); - sbret?.Clear(); - return ret; - } + { + exception = ex; + throw; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfterHandler?.Invoke(this, after); + } + }); + sbret?.Clear(); + return ret; + } - protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) + protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { if (primarys.Length == 1) { @@ -134,14 +121,11 @@ namespace FreeSql.Custom.MySql public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); protected override Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns, cancellationToken); - async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) - { + async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) + { var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -151,19 +135,12 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -172,12 +149,8 @@ namespace FreeSql.Custom.MySql Exception exception = null; try { - var rettmp = new List(); - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } @@ -196,5 +169,5 @@ namespace FreeSql.Custom.MySql return ret; } #endif - } + } } diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs index b83ce2cba..5d38e44a8 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs @@ -24,9 +24,6 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -36,31 +33,21 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); + ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); } catch (Exception ex) { @@ -73,7 +60,11 @@ namespace FreeSql.MySql.Curd _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - sbret?.Clear(); + if (dbParms != null) + { + this.ClearData(); + sbret.Clear(); + } return ret; } @@ -84,9 +75,6 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -96,32 +84,21 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); } catch (Exception ex) { @@ -134,7 +111,11 @@ namespace FreeSql.MySql.Curd _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - sbret?.Clear(); + if (dbParms != null) + { + this.ClearData(); + sbret.Clear(); + } return ret; } #endif diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index 634fb541b..82e44fe09 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -79,20 +79,12 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -100,10 +92,7 @@ namespace FreeSql.MySql.Curd Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = _orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) { @@ -159,20 +148,12 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -180,11 +161,7 @@ namespace FreeSql.MySql.Curd Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken); } catch (Exception ex) { diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index 2d63a1244..bccb59111 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -31,14 +31,11 @@ namespace FreeSql.MySql.Curd public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); protected override List ExecuteUpdated(IEnumerable columns) => base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); - protected override List RawExecuteUpdated(IEnumerable columns) - { + protected override List RawExecuteUpdated(IEnumerable columns) + { var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -48,19 +45,12 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -68,13 +58,10 @@ namespace FreeSql.MySql.Curd Exception exception = null; try - { - var rettmp = new List(); - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) @@ -134,14 +121,11 @@ namespace FreeSql.MySql.Curd public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); protected override Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns, cancellationToken); - async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) - { + async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) + { var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -151,19 +135,12 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -172,12 +149,8 @@ namespace FreeSql.MySql.Curd Exception exception = null; try { - var rettmp = new List(); - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs index 20dda3188..24aa2168e 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlDelete.cs @@ -24,9 +24,6 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -36,31 +33,21 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); + ret.AddRange(_orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms)); } catch (Exception ex) { @@ -73,7 +60,11 @@ namespace FreeSql.Odbc.MySql _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - sbret?.Clear(); + if (dbParms != null) + { + this.ClearData(); + sbret.Clear(); + } return ret; } @@ -84,9 +75,6 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - var queryType = _table.TypeLazy ?? _table.Type; - int[] queryIndexs = null; - var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -96,32 +84,21 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ret.AddRange(await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken)); } catch (Exception ex) { @@ -134,7 +111,11 @@ namespace FreeSql.Odbc.MySql _orm.Aop.CurdAfterHandler?.Invoke(this, after); } }); - sbret?.Clear(); + if (dbParms != null) + { + this.ClearData(); + sbret.Clear(); + } return ret; } #endif diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs index 53f59dfd4..25adfbe3b 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs @@ -91,20 +91,12 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -112,10 +104,7 @@ namespace FreeSql.Odbc.MySql Exception exception = null; try { - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = _orm.Ado.Query(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params); } catch (Exception ex) { @@ -182,20 +171,12 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in _table.Columns.Values) { if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - var queryType = _table.TypeLazy ?? _table.Type; - var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); @@ -203,11 +184,7 @@ namespace FreeSql.Odbc.MySql Exception exception = null; try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, _params); + ret = await _orm.Ado.QueryAsync(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, _params, cancellationToken); } catch (Exception ex) { diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs index f08cf6814..058a05764 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs @@ -31,14 +31,11 @@ namespace FreeSql.Odbc.MySql public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000); protected override List ExecuteUpdated(IEnumerable columns) => base.SplitExecuteUpdated(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); - protected override List RawExecuteUpdated(IEnumerable columns) - { - var ret = new List(); - DbParameter[] dbParms = null; - StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; + protected override List RawExecuteUpdated(IEnumerable columns) + { + var ret = new List(); + DbParameter[] dbParms = null; + StringBuilder sbret = null; ToSqlFetch(sb => { if (dbParms == null) @@ -48,19 +45,12 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -69,30 +59,27 @@ namespace FreeSql.Odbc.MySql Exception exception = null; try { - var rettmp = new List(); - _orm.Ado.ExecuteReader(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - }, CommandType.Text, sql, _commandTimeout, dbParms); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) - { - exception = ex; - throw; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfterHandler?.Invoke(this, after); - } - }); - sbret?.Clear(); - return ret; - } + { + exception = ex; + throw; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfterHandler?.Invoke(this, after); + } + }); + sbret?.Clear(); + return ret; + } - protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) + protected override void ToSqlCase(StringBuilder caseWhen, ColumnInfo[] primarys) { if (primarys.Length == 1) { @@ -134,14 +121,11 @@ namespace FreeSql.Odbc.MySql public override Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default) => base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); protected override Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns, cancellationToken); - async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) - { - var ret = new List(); - DbParameter[] dbParms = null; - StringBuilder sbret = null; - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - int[] queryIndexs = null; - var queryFlag = ""; + async protected override Task> RawExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default) + { + var ret = new List(); + DbParameter[] dbParms = null; + StringBuilder sbret = null; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -151,19 +135,12 @@ namespace FreeSql.Odbc.MySql sbret.Append(" RETURNING "); var colidx = 0; - var sbflag = new StringBuilder().Append("adoQuery(crud)"); - var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - if (dic.ContainsKey(col.CsName)) continue; - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - dic.Add(col.CsName, colidx); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); ++colidx; } - queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); - queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -172,29 +149,25 @@ namespace FreeSql.Odbc.MySql Exception exception = null; try { - var rettmp = new List(); - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => - { - rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); - return Task.FromResult(false); - }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) - { - exception = ex; - throw; - } - finally - { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfterHandler?.Invoke(this, after); - } - }); - sbret?.Clear(); - return ret; - } + { + exception = ex; + throw; + } + finally + { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfterHandler?.Invoke(this, after); + } + }); + sbret?.Clear(); + return ret; + } #endif - } + } }