Skip to content

Commit 1fcda96

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

File tree

9 files changed

+135
-58
lines changed

9 files changed

+135
-58
lines changed

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

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using FreeSql.Internal;
2+
using FreeSql.Internal.CommonProvider;
23
using System;
34
using System.Collections.Generic;
45
using System.Data;
56
using System.Data.Common;
7+
using System.Linq;
68
using System.Text;
79
using System.Threading;
810
using System.Threading.Tasks;
@@ -22,6 +24,9 @@ public override List<T1> ExecuteDeleted()
2224
var ret = new List<T1>();
2325
DbParameter[] dbParms = null;
2426
StringBuilder sbret = null;
27+
var queryType = _table.TypeLazy ?? _table.Type;
28+
int[] queryIndexs = null;
29+
var queryFlag = "";
2530
ToSqlFetch(sb =>
2631
{
2732
if (dbParms == null)
@@ -31,21 +36,31 @@ public override List<T1> ExecuteDeleted()
3136
sbret.Append(" RETURNING ");
3237

3338
var colidx = 0;
39+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
40+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
3441
foreach (var col in _table.Columns.Values)
3542
{
3643
if (colidx > 0) sbret.Append(", ");
37-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
44+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
45+
if (dic.ContainsKey(col.CsName)) continue;
46+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
47+
dic.Add(col.CsName, colidx);
3848
++colidx;
3949
}
50+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
51+
queryFlag = sbflag.ToString();
4052
}
4153
var sql = sb.Append(sbret).ToString();
42-
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms);
54+
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
4355
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
4456

4557
Exception exception = null;
4658
try
4759
{
48-
ret.AddRange(_orm.Ado.Query<T1>(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms));
60+
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
61+
{
62+
ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
63+
}, CommandType.Text, sql, _commandTimeout, dbParms);
4964
}
5065
catch (Exception ex)
5166
{
@@ -73,6 +88,9 @@ async public override Task<List<T1>> ExecuteDeletedAsync(CancellationToken cance
7388
var ret = new List<T1>();
7489
DbParameter[] dbParms = null;
7590
StringBuilder sbret = null;
91+
var queryType = _table.TypeLazy ?? _table.Type;
92+
int[] queryIndexs = null;
93+
var queryFlag = "";
7694
await ToSqlFetchAsync(async sb =>
7795
{
7896
if (dbParms == null)
@@ -82,21 +100,32 @@ await ToSqlFetchAsync(async sb =>
82100
sbret.Append(" RETURNING ");
83101

84102
var colidx = 0;
103+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
104+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
85105
foreach (var col in _table.Columns.Values)
86106
{
87107
if (colidx > 0) sbret.Append(", ");
88-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
108+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
109+
if (dic.ContainsKey(col.CsName)) continue;
110+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
111+
dic.Add(col.CsName, colidx);
89112
++colidx;
90113
}
114+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
115+
queryFlag = sbflag.ToString();
91116
}
92117
var sql = sb.Append(sbret).ToString();
93-
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms);
118+
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
94119
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
95120

96121
Exception exception = null;
97122
try
98123
{
99-
ret.AddRange(await _orm.Ado.QueryAsync<T1>(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken));
124+
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
125+
{
126+
ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
127+
return Task.FromResult(false);
128+
}, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken);
100129
}
101130
catch (Exception ex)
102131
{

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ protected override List<T1> RawExecuteInserted()
102102
dic.Add(col.CsName, colidx);
103103
++colidx;
104104
}
105-
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
105+
var queryType = _table.TypeLazy ?? _table.Type;
106+
var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
106107
var flag = sbflag.ToString();
107108
sql = sb.ToString();
108109
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@@ -113,7 +114,7 @@ protected override List<T1> RawExecuteInserted()
113114
{
114115
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
115116
{
116-
ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils));
117+
ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils));
117118
}, CommandType.Text, sql, _commandTimeout, _params);
118119
}
119120
catch (Exception ex)
@@ -192,7 +193,8 @@ async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToke
192193
dic.Add(col.CsName, colidx);
193194
++colidx;
194195
}
195-
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
196+
var queryType = _table.TypeLazy ?? _table.Type;
197+
var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
196198
var flag = sbflag.ToString();
197199
sql = sb.ToString();
198200
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@@ -203,7 +205,7 @@ async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToke
203205
{
204206
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
205207
{
206-
ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils));
208+
ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils));
207209
return Task.FromResult(false);
208210
}, CommandType.Text, sql, _commandTimeout, _params);
209211
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protected override List<TReturn> RawExecuteUpdated<TReturn>(IEnumerable<ColumnIn
5252
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
5353
foreach (var col in columns)
5454
{
55-
if (colidx > 0) sb.Append(", ");
55+
if (colidx > 0) sbret.Append(", ");
5656
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
5757
if (dic.ContainsKey(col.CsName)) continue;
5858
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
@@ -155,7 +155,7 @@ await ToSqlFetchAsync(async sb =>
155155
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
156156
foreach (var col in columns)
157157
{
158-
if (colidx > 0) sb.Append(", ");
158+
if (colidx > 0) sbret.Append(", ");
159159
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
160160
if (dic.ContainsKey(col.CsName)) continue;
161161
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");

Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using FreeSql.Internal;
2+
using FreeSql.Internal.CommonProvider;
23
using System;
34
using System.Collections.Generic;
45
using System.Data;
56
using System.Data.Common;
7+
using System.Linq;
68
using System.Text;
79
using System.Threading;
810
using System.Threading.Tasks;
@@ -22,6 +24,9 @@ public override List<T1> ExecuteDeleted()
2224
var ret = new List<T1>();
2325
DbParameter[] dbParms = null;
2426
StringBuilder sbret = null;
27+
var queryType = _table.TypeLazy ?? _table.Type;
28+
int[] queryIndexs = null;
29+
var queryFlag = "";
2530
ToSqlFetch(sb =>
2631
{
2732
if (dbParms == null)
@@ -31,21 +36,31 @@ public override List<T1> ExecuteDeleted()
3136
sbret.Append(" RETURNING ");
3237

3338
var colidx = 0;
39+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
40+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
3441
foreach (var col in _table.Columns.Values)
3542
{
3643
if (colidx > 0) sbret.Append(", ");
37-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
44+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
45+
if (dic.ContainsKey(col.CsName)) continue;
46+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
47+
dic.Add(col.CsName, colidx);
3848
++colidx;
3949
}
50+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
51+
queryFlag = sbflag.ToString();
4052
}
4153
var sql = sb.Append(sbret).ToString();
42-
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms);
54+
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
4355
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
4456

4557
Exception exception = null;
4658
try
4759
{
48-
ret.AddRange(_orm.Ado.Query<T1>(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms));
60+
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
61+
{
62+
ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
63+
}, CommandType.Text, sql, _commandTimeout, dbParms);
4964
}
5065
catch (Exception ex)
5166
{
@@ -58,11 +73,7 @@ public override List<T1> ExecuteDeleted()
5873
_orm.Aop.CurdAfterHandler?.Invoke(this, after);
5974
}
6075
});
61-
if (dbParms != null)
62-
{
63-
this.ClearData();
64-
sbret.Clear();
65-
}
76+
sbret?.Clear();
6677
return ret;
6778
}
6879

@@ -73,6 +84,9 @@ async public override Task<List<T1>> ExecuteDeletedAsync(CancellationToken cance
7384
var ret = new List<T1>();
7485
DbParameter[] dbParms = null;
7586
StringBuilder sbret = null;
87+
var queryType = _table.TypeLazy ?? _table.Type;
88+
int[] queryIndexs = null;
89+
var queryFlag = "";
7690
await ToSqlFetchAsync(async sb =>
7791
{
7892
if (dbParms == null)
@@ -82,21 +96,32 @@ await ToSqlFetchAsync(async sb =>
8296
sbret.Append(" RETURNING ");
8397

8498
var colidx = 0;
99+
var sbflag = new StringBuilder().Append("adoQuery(crud)");
100+
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
85101
foreach (var col in _table.Columns.Values)
86102
{
87103
if (colidx > 0) sbret.Append(", ");
88-
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName));
104+
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
105+
if (dic.ContainsKey(col.CsName)) continue;
106+
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
107+
dic.Add(col.CsName, colidx);
89108
++colidx;
90109
}
110+
queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
111+
queryFlag = sbflag.ToString();
91112
}
92113
var sql = sb.Append(sbret).ToString();
93-
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Delete, sql, dbParms);
114+
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms);
94115
_orm.Aop.CurdBeforeHandler?.Invoke(this, before);
95116

96117
Exception exception = null;
97118
try
98119
{
99-
ret.AddRange(await _orm.Ado.QueryAsync<T1>(_table.TypeLazy ?? _table.Type, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken));
120+
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
121+
{
122+
ret.Add((T1)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils));
123+
return Task.FromResult(false);
124+
}, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken);
100125
}
101126
catch (Exception ex)
102127
{
@@ -109,11 +134,7 @@ await ToSqlFetchAsync(async sb =>
109134
_orm.Aop.CurdAfterHandler?.Invoke(this, after);
110135
}
111136
});
112-
if (dbParms != null)
113-
{
114-
this.ClearData();
115-
sbret.Clear();
116-
}
137+
sbret?.Clear();
117138
return ret;
118139
}
119140
#endif

Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ protected override List<T1> RawExecuteInserted()
9090
dic.Add(col.CsName, colidx);
9191
++colidx;
9292
}
93-
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
93+
var queryType = _table.TypeLazy ?? _table.Type;
94+
var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
9495
var flag = sbflag.ToString();
9596
sql = sb.ToString();
9697
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@@ -101,7 +102,7 @@ protected override List<T1> RawExecuteInserted()
101102
{
102103
_orm.Ado.ExecuteReader(_connection, _transaction, fetch =>
103104
{
104-
ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils));
105+
ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils));
105106
}, CommandType.Text, sql, _commandTimeout, _params);
106107
}
107108
catch (Exception ex)
@@ -169,7 +170,8 @@ async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToke
169170
dic.Add(col.CsName, colidx);
170171
++colidx;
171172
}
172-
var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
173+
var queryType = _table.TypeLazy ?? _table.Type;
174+
var indexes = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray();
173175
var flag = sbflag.ToString();
174176
sql = sb.ToString();
175177
var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
@@ -180,7 +182,7 @@ async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToke
180182
{
181183
await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch =>
182184
{
183-
ret.Add((T1)Utils.ExecuteReaderToClass(flag, _table.TypeLazy ?? _table.Type, indexes, fetch.Object, 0, _commonUtils));
185+
ret.Add((T1)Utils.ExecuteReaderToClass(flag, queryType, indexes, fetch.Object, 0, _commonUtils));
184186
return Task.FromResult(false);
185187
}, CommandType.Text, sql, _commandTimeout, _params);
186188
}

Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protected override List<TReturn> RawExecuteUpdated<TReturn>(IEnumerable<ColumnIn
5252
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
5353
foreach (var col in columns)
5454
{
55-
if (colidx > 0) sb.Append(", ");
55+
if (colidx > 0) sbret.Append(", ");
5656
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
5757
if (dic.ContainsKey(col.CsName)) continue;
5858
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");
@@ -155,7 +155,7 @@ await ToSqlFetchAsync(async sb =>
155155
var dic = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);
156156
foreach (var col in columns)
157157
{
158-
if (colidx > 0) sb.Append(", ");
158+
if (colidx > 0) sbret.Append(", ");
159159
sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name)));
160160
if (dic.ContainsKey(col.CsName)) continue;
161161
sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(",");

0 commit comments

Comments
 (0)