Skip to content

Commit fbf62b6

Browse files
2881028810
authored andcommitted
- 增加 Aop.AuditDataReader 事件拦截 DataReader 读取值 #436
1 parent 824d60c commit fbf62b6

File tree

10 files changed

+136
-26
lines changed

10 files changed

+136
-26
lines changed

FreeSql.DbContext/FreeSql.DbContext.xml

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

FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,62 @@
44
using System;
55
using System.Collections.Generic;
66
using System.ComponentModel.DataAnnotations;
7+
using System.Diagnostics;
78
using System.Linq;
89
using System.Security.Cryptography.X509Certificates;
910
using System.Text;
11+
using System.Threading;
1012
using Xunit;
1113

1214
namespace FreeSql.Tests.Oracle
1315
{
1416
public class OracleCodeFirstTest
1517
{
18+
[Fact]
19+
public void StringNullToEmpty()
20+
{
21+
using (var fsql = new FreeSql.FreeSqlBuilder()
22+
.UseConnectionString(FreeSql.DataType.Oracle, "user id=1user;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=5;min pool size=1")
23+
.UseAutoSyncStructure(true)
24+
//.UseGenerateCommandParameterWithLambda(true)
25+
.UseLazyLoading(true)
26+
.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
27+
//.UseNoneCommandParameter(true)
28+
29+
.UseMonitorCommand(
30+
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
31+
//, (cmd, traceLog) => Console.WriteLine(traceLog)
32+
)
33+
.Build())
34+
{
35+
var repo = fsql.GetRepository<TS_SL361, long>();
36+
37+
var item1 = new TS_SL361 { CreatorId = "" };
38+
repo.Insert(item1);
39+
var item2 = repo.Get(item1.Id);
40+
41+
Assert.Null(item2.CreatorId);
42+
43+
fsql.Aop.AuditDataReader += (_, e) =>
44+
{
45+
if (e.DataReader.GetFieldType(e.Index) == typeof(string) && e.Value == DBNull.Value)
46+
e.Value = "";
47+
};
48+
49+
item1 = new TS_SL361 { CreatorId = "" };
50+
repo.Insert(item1);
51+
item2 = repo.Get(item1.Id);
52+
53+
Assert.Equal(item1.CreatorId, item2.CreatorId);
54+
}
55+
}
56+
class TS_SNTE
57+
{
58+
[Column(IsIdentity = true)]
59+
public long Id { get; set; }
60+
public string CreatorId { get; set; }
61+
}
62+
1663
[Fact]
1764
public void StringLength36()
1865
{

FreeSql/FreeSql.xml

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

FreeSql/Interface/IAop.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ public interface IAop
5757
event EventHandler<Aop.AuditValueEventArgs> AuditValue;
5858
EventHandler<Aop.AuditValueEventArgs> AuditValueHandler { get; }
5959

60+
/// <summary>
61+
/// ADO.NET DataReader 拦截
62+
/// </summary>
63+
event EventHandler<Aop.AuditDataReaderEventArgs> AuditDataReader;
64+
EventHandler<Aop.AuditDataReaderEventArgs> AuditDataReaderHandler { get; }
65+
6066
/// <summary>
6167
/// 监视数据库命令对象(执行前,调试)
6268
/// </summary>
@@ -318,15 +324,59 @@ public object Value
318324
set
319325
{
320326
_value = value;
321-
this.IsChanged = true;
327+
this.ValueIsChanged = true;
322328
}
323329
}
324330
private object _value;
325-
public bool IsChanged { get; private set; }
331+
public bool ValueIsChanged { get; private set; }
326332
}
327333
public enum AuditValueType { Update, Insert, InsertOrUpdate }
328334
#endregion
329335

336+
#region AuditDataReader
337+
public class AuditDataReaderEventArgs : EventArgs
338+
{
339+
public AuditDataReaderEventArgs(DbDataReader dataReader, int index)
340+
{
341+
this.DataReader = dataReader;
342+
this.Index = index;
343+
}
344+
345+
/// <summary>
346+
/// ADO.NET 数据流读取对象
347+
/// </summary>
348+
public DbDataReader DataReader { get; }
349+
/// <summary>
350+
/// DataReader 对应的 Index 位置
351+
/// </summary>
352+
public int Index { get; }
353+
/// <summary>
354+
/// 获取 Index 对应的值,也可以设置拦截的新值
355+
/// </summary>
356+
public object Value
357+
{
358+
get
359+
{
360+
if (_valueIsGeted == false)
361+
{
362+
_value = DataReader.GetValue(Index);
363+
_valueIsGeted = true;
364+
}
365+
return _value;
366+
}
367+
set
368+
{
369+
_value = value;
370+
ValueIsChanged = true;
371+
_valueIsGeted = true;
372+
}
373+
}
374+
private object _value;
375+
internal bool _valueIsGeted;
376+
public bool ValueIsChanged { get; private set; }
377+
}
378+
#endregion
379+
330380
#region CommandBefore/After
331381
public class CommandBeforeEventArgs : EventArgs
332382
{

FreeSql/Internal/CommonExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ public object ReadAnonymous(ReadAnonymousTypeInfo parent, DbDataReader dr, ref i
309309
return Utils.GetDataReaderValue(parent.Property.PropertyType, null);
310310
return Utils.GetDataReaderValue(parent.CsType, null);
311311
}
312-
object objval = dr.GetValue(++index);
312+
object objval = Utils.InternalDataReaderGetValue(_common, dr, ++index); // dr.GetValue(++index);
313313
if (dbValue != null) dbValue.DbValue = objval == DBNull.Value ? null : objval;
314314
if (parent.CsType != parent.MapType)
315315
objval = Utils.GetDataReaderValue(parent.MapType, objval);

FreeSql/Internal/CommonProvider/AopProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class AopProvider : IAop
1818
public event EventHandler<Aop.SyncStructureAfterEventArgs> SyncStructureAfter;
1919

2020
public event EventHandler<Aop.AuditValueEventArgs> AuditValue;
21+
public event EventHandler<Aop.AuditDataReaderEventArgs> AuditDataReader;
2122

2223
public event EventHandler<Aop.CommandBeforeEventArgs> CommandBefore;
2324
public event EventHandler<Aop.CommandAfterEventArgs> CommandAfter;
@@ -36,6 +37,7 @@ public class AopProvider : IAop
3637
public EventHandler<Aop.SyncStructureAfterEventArgs> SyncStructureAfterHandler => SyncStructureAfter;
3738

3839
public EventHandler<Aop.AuditValueEventArgs> AuditValueHandler => AuditValue;
40+
public EventHandler<Aop.AuditDataReaderEventArgs> AuditDataReaderHandler => AuditDataReader;
3941

4042
public EventHandler<Aop.CommandBeforeEventArgs> CommandBeforeHandler => CommandBefore;
4143
public EventHandler<Aop.CommandAfterEventArgs> CommandAfterHandler => CommandAfter;

FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public static void AuditDataValue(object sender, IEnumerable<T1> data, IFreeSql
8181
object val = col.GetValue(d);
8282
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.InsertOrUpdate, col, table.Properties[col.CsName], val);
8383
orm.Aop.AuditValueHandler(sender, auditArgs);
84-
if (auditArgs.IsChanged)
84+
if (auditArgs.ValueIsChanged)
8585
{
8686
col.SetValue(d, val = auditArgs.Value);
8787
if (changedDict != null && changedDict.ContainsKey(col.Attribute.Name) == false)
@@ -101,7 +101,7 @@ public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInf
101101
object val = col.GetValue(data);
102102
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.InsertOrUpdate, col, table.Properties[col.CsName], val);
103103
orm.Aop.AuditValueHandler(sender, auditArgs);
104-
if (auditArgs.IsChanged)
104+
if (auditArgs.ValueIsChanged)
105105
{
106106
col.SetValue(data, val = auditArgs.Value);
107107
if (changedDict != null && changedDict.ContainsKey(col.Attribute.Name) == false)

FreeSql/Internal/CommonProvider/InsertProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInf
152152
{
153153
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Insert, col, table.Properties[col.CsName], val);
154154
orm.Aop.AuditValueHandler(sender, auditArgs);
155-
if (auditArgs.IsChanged)
155+
if (auditArgs.ValueIsChanged)
156156
{
157157
col.SetValue(data, val = auditArgs.Value);
158158
if (changedDict != null && changedDict.ContainsKey(col.Attribute.Name) == false)

FreeSql/Internal/CommonProvider/UpdateProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ public static void AuditDataValue(object sender, IEnumerable<T1> data, IFreeSql
353353
object val = col.GetValue(d);
354354
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Update, col, table.Properties[col.CsName], val);
355355
orm.Aop.AuditValueHandler(sender, auditArgs);
356-
if (auditArgs.IsChanged)
356+
if (auditArgs.ValueIsChanged)
357357
{
358358
col.SetValue(d, val = auditArgs.Value);
359359
if (changedDict != null && changedDict.ContainsKey(col.Attribute.Name) == false)
@@ -373,7 +373,7 @@ public static void AuditDataValue(object sender, T1 data, IFreeSql orm, TableInf
373373
object val = col.GetValue(data);
374374
var auditArgs = new Aop.AuditValueEventArgs(Aop.AuditValueType.Update, col, table.Properties[col.CsName], val);
375375
orm.Aop.AuditValueHandler(sender, auditArgs);
376-
if (auditArgs.IsChanged)
376+
if (auditArgs.ValueIsChanged)
377377
{
378378
col.SetValue(data, val = auditArgs.Value);
379379
if (changedDict != null && changedDict.ContainsKey(col.Attribute.Name) == false)

FreeSql/Internal/UtilsExpressionTree.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,7 +1324,14 @@ public RowInfo(object value, int dataIndex)
13241324
internal static PropertyInfo PropertyDataReaderFieldCount = typeof(DbDataReader).GetProperty("FieldCount");
13251325
internal static object InternalDataReaderGetValue(CommonUtils commonUtil, DbDataReader dr, int index)
13261326
{
1327-
if (commonUtil._orm.Ado.DataType == DataType.Dameng && dr.IsDBNull(index)) return null;
1327+
var orm = commonUtil._orm;
1328+
if (orm.Aop.AuditDataReaderHandler != null)
1329+
{
1330+
var args = new Aop.AuditDataReaderEventArgs(dr, index);
1331+
orm.Aop.AuditDataReaderHandler(orm, args);
1332+
return args.Value;
1333+
}
1334+
if (orm.Ado.DataType == DataType.Dameng && dr.IsDBNull(index)) return null; //OdbcDameng 不会报错
13281335
return dr.GetValue(index);
13291336
}
13301337
internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typeOrg, int[] indexes, DbDataReader row, int dataIndex, CommonUtils _commonUtils)
@@ -1447,7 +1454,7 @@ internal static RowInfo ExecuteArrayRowReadClassOrTuple(string flagStr, Type typ
14471454
var name = row2.GetName(a);
14481455
//expando[name] = row2.GetValue(a);
14491456
if (expandodic.ContainsKey(name)) continue;
1450-
expandodic.Add(name, row2.GetValue(a));
1457+
expandodic.Add(name, Utils.InternalDataReaderGetValue(_commonUtils, row2, a));
14511458
}
14521459
//expando = expandodic;
14531460
return new RowInfo(expandodic, fc);

0 commit comments

Comments
 (0)