Skip to content

Commit bdeb264

Browse files
committed
- 修复 MySql8.0.30 无法使用 ExecuteInserted 的问题;#2001
1 parent 53172a4 commit bdeb264

File tree

11 files changed

+287
-201
lines changed

11 files changed

+287
-201
lines changed

Examples/base_entity/Program.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,16 @@ static void Main(string[] args)
621621
BaseEntity.Initialization(fsql, () => _asyncUow.Value);
622622
#endregion
623623

624+
fsql.Delete<User1>().Where("1=1").ExecuteAffrows();
625+
fsql.Insert(new List<User1>
626+
{
627+
new User1 { Nickname = "nickname11", Username = "username11", Description = "desc11" },
628+
new User1 { Nickname = "n2", Username = "u2", Description = "d2" },
629+
new User1 { Nickname = "n3", Username = "u3", Description = "d3" },
630+
}).ExecuteAffrows();
631+
624632
fsql.Insert(new User1()).ExecuteInserted();
633+
fsql.Update<User1>().SetSource(new User1()).ExecuteUpdated();
625634

626635
fsql.InsertOrUpdate<AppInfoEntity>().SetSource(new AppInfoEntity { AppID = "03DN8CW8", AppName = "app_01" }).ExecuteAffrows();
627636
var repo2211 = fsql.GetRepository<AppInfoEntity>();

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ void LoggerException(IObjectPool<DbConnection> pool, PrepareCommandResult pc, Ex
9292
}
9393
}
9494

95-
internal Dictionary<string, PropertyInfo> GetQueryTypeProperties(Type type)
95+
public static Dictionary<string, PropertyInfo> GetQueryTypeProperties(Type type)
9696
{
9797
return type.GetPropertiesDictIgnoreCase(); //与 ExecuteArrayRowReadClassOrTuple 顺序同步,防止【延时属性】获取到位置不对的问题
9898
//var tb = _util.GetTableByEntity(type);

FreeSql/Internal/CommonProvider/UpdateProvider.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq;
99
using System.Linq.Expressions;
1010
using System.Text;
11+
using System.Threading;
1112
using System.Threading.Tasks;
1213

1314
namespace FreeSql.Internal.CommonProvider
@@ -476,13 +477,20 @@ protected int RawExecuteAffrows()
476477
public abstract int ExecuteAffrows();
477478
protected abstract List<TReturn> ExecuteUpdated<TReturn>(IEnumerable<ColumnInfo> columns);
478479

479-
public List<T1> ExecuteUpdated() => ExecuteUpdated<T1>(_table.ColumnsByPosition);
480+
public List<T1> ExecuteUpdated()
481+
{
482+
var ret = ExecuteUpdated<T1>(_table.Columns.Values);
483+
if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm }));
484+
return ret;
485+
}
480486
public List<TReturn> ExecuteUpdated<TReturn>(Expression<Func<T1, TReturn>> returnColumns)
481487
{
482488
var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null)
483489
.Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray();
484-
return ExecuteUpdated<TReturn>(cols);
485-
}
490+
var ret = ExecuteUpdated<TReturn>(cols);
491+
if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm }));
492+
return ret;
493+
}
486494

487495
public IUpdate<T1> IgnoreColumns(Expression<Func<T1, object>> columns) => IgnoreColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null));
488496
public IUpdate<T1> UpdateColumns(Expression<Func<T1, object>> columns) => UpdateColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null));

FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,20 @@ await ToSqlFetchAsync(async sb =>
143143
public abstract Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default);
144144
protected abstract Task<List<TReturn>> ExecuteUpdatedAsync<TReturn>(IEnumerable<ColumnInfo> columns, CancellationToken cancellationToken = default);
145145

146-
public Task<List<T1>> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) => ExecuteUpdatedAsync<T1>(_table.ColumnsByPosition, cancellationToken);
147-
public Task<List<TReturn>> ExecuteUpdatedAsync<TReturn>(Expression<Func<T1, TReturn>> returnColumns, CancellationToken cancellationToken = default)
146+
async public Task<List<T1>> ExecuteUpdatedAsync(CancellationToken cancellationToken = default)
147+
{
148+
var ret = await ExecuteUpdatedAsync<T1>(_table.ColumnsByPosition, cancellationToken);
149+
if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm }));
150+
return ret;
151+
}
152+
async public Task<List<TReturn>> ExecuteUpdatedAsync<TReturn>(Expression<Func<T1, TReturn>> returnColumns, CancellationToken cancellationToken = default)
148153
{
149154
var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null)
150155
.Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray();
151-
return ExecuteUpdatedAsync<TReturn>(cols, cancellationToken);
152-
}
156+
var ret = await ExecuteUpdatedAsync<TReturn>(cols, cancellationToken);
157+
if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm }));
158+
return ret;
159+
}
153160
#endif
154161
}
155162
}

Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using FreeSql.Internal;
2+
using FreeSql.Internal.CommonProvider;
23
using FreeSql.Internal.Model;
34
using FreeSql.Internal.ObjectPool;
45
using System;
56
using System.Collections.Generic;
67
using System.Data;
78
using System.Data.Common;
9+
using System.Linq;
810
using System.Text;
911
using System.Threading;
1012
using System.Threading.Tasks;
@@ -89,24 +91,18 @@ protected override List<T1> RawExecuteInserted()
8991
sb.Append(sql).Append(" RETURNING ");
9092

9193
var colidx = 0;
92-
var propidx = 0;
93-
var props = _table.Type.GetPropertiesDictIgnoreCase();
94-
var indexes = new int[props.Count];
95-
var sbflag = new StringBuilder().Append("insertedQuery");
96-
foreach (var prop in props)
94+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
95+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
96+
foreach (var col in _table.Columns.Values)
9797
{
98-
if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col))
99-
{
100-
if (colidx > 0) sb.Append(", ");
101-
sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
102-
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
103-
indexes[propidx] = colidx;
104-
++colidx;
105-
}
106-
else
107-
indexes[propidx] = -1;
108-
++propidx;
98+
if (colidx > 0) sb.Append(", ");
99+
sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
100+
if (dic.ContainsKey(col.CsName)) continue;
101+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
102+
dic.Add(col.CsName, colidx);
103+
++colidx;
109104
}
105+
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
110106
var flag = sbflag.ToString();
111107
sql = sb.ToString();
112108
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@@ -185,24 +181,18 @@ async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToke
185181
sb.Append(sql).Append(" RETURNING ");
186182

187183
var colidx = 0;
188-
var propidx = 0;
189-
var props = _table.Type.GetPropertiesDictIgnoreCase();
190-
var indexes = new int[props.Count];
191-
var sbflag = new StringBuilder().Append("insertedQuery");
192-
foreach (var prop in props)
184+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
185+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
186+
foreach (var col in _table.Columns.Values)
193187
{
194-
if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col))
195-
{
196-
if (colidx > 0) sb.Append(", ");
197-
sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
198-
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
199-
indexes[propidx] = colidx;
200-
++colidx;
201-
}
202-
else
203-
indexes[propidx] = -1;
204-
++propidx;
188+
if (colidx > 0) sb.Append(", ");
189+
sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
190+
if (dic.ContainsKey(col.CsName)) continue;
191+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
192+
dic.Add(col.CsName, colidx);
193+
++colidx;
205194
}
195+
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
206196
var flag = sbflag.ToString();
207197
sql = sb.ToString();
208198
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);

Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs

Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FreeSql.Internal;
2+
using FreeSql.Internal.CommonProvider;
23
using FreeSql.Internal.Model;
34
using System;
45
using System.Collections.Generic;
@@ -35,35 +36,48 @@ protected override List<TReturn> RawExecuteUpdated<TReturn>(IEnumerable<ColumnIn
3536
var ret = new List<TReturn>();
3637
DbParameter[] dbParms = null;
3738
StringBuilder sbret = null;
38-
ToSqlFetch(sb =>
39-
{
40-
if (dbParms == null)
41-
{
42-
dbParms = _params.Concat(_paramsSource).ToArray();
43-
sbret = new StringBuilder();
44-
sbret.Append(" RETURNING ");
39+
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
40+
int[] queryIndexs = null;
41+
var queryFlag = "";
42+
ToSqlFetch(sb =>
43+
{
44+
if (dbParms == null)
45+
{
46+
dbParms = _params.Concat(_paramsSource).ToArray();
47+
sbret = new StringBuilder();
48+
sbret.Append(" RETURNING ");
4549

46-
var colidx = 0;
47-
foreach (var col in columns)
48-
{
49-
if (colidx > 0) sbret.Append(", ");
50-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
51-
++colidx;
52-
}
53-
}
54-
var sql = sb.Append(sbret).ToString();
55-
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
56-
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
50+
var colidx = 0;
51+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
52+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
53+
foreach (var col in columns)
54+
{
55+
if (colidx > 0) sb.Append(", ");
56+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
57+
if (dic.ContainsKey(col.CsName)) continue;
58+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
59+
dic.Add(col.CsName, colidx);
60+
++colidx;
61+
}
62+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
63+
queryFlag = sbflag.ToString();
64+
}
65+
var sql = sb.Append(sbret).ToString();
66+
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
67+
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
5768

58-
Exception exception = null;
59-
try
60-
{
61-
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
62-
var rettmp = _orm.Ado.Query<TReturn>(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms);
63-
ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
64-
ret.AddRange(rettmp);
65-
}
66-
catch (Exception ex)
69+
Exception exception = null;
70+
try
71+
{
72+
var rettmp = new List<TReturn>();
73+
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
74+
{
75+
rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
76+
}, CommandType.Text, sql, _commandTimeout, dbParms);
77+
ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
78+
ret.AddRange(rettmp);
79+
}
80+
catch (Exception ex)
6781
{
6882
exception = ex;
6983
throw;
@@ -125,6 +139,9 @@ async protected override Task<List<TReturn>> RawExecuteUpdatedAsync<TReturn>(IEn
125139
var ret = new List<TReturn>();
126140
DbParameter[] dbParms = null;
127141
StringBuilder sbret = null;
142+
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
143+
int[] queryIndexs = null;
144+
var queryFlag = "";
128145
await ToSqlFetchAsync(async sb =>
129146
{
130147
if (dbParms == null)
@@ -134,23 +151,34 @@ await ToSqlFetchAsync(async sb =>
134151
sbret.Append(" RETURNING ");
135152

136153
var colidx = 0;
154+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
155+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
137156
foreach (var col in columns)
138157
{
139-
if (colidx > 0) sbret.Append(", ");
140-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
158+
if (colidx > 0) sb.Append(", ");
159+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
160+
if (dic.ContainsKey(col.CsName)) continue;
161+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
162+
dic.Add(col.CsName, colidx);
141163
++colidx;
142164
}
165+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
166+
queryFlag = sbflag.ToString();
143167
}
144168
var sql = sb.Append(sbret).ToString();
145169
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
146170
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
147171

148172
Exception exception = null;
149173
try
150-
{
151-
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
152-
var rettmp = await _orm.Ado.QueryAsync<TReturn>(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken);
153-
ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
174+
{
175+
var rettmp = new List<TReturn>();
176+
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
177+
{
178+
rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
179+
return Task.FromResult(false);
180+
}, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken);
181+
ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
154182
ret.AddRange(rettmp);
155183
}
156184
catch (Exception ex)

0 commit comments

Comments
 (0)