1- Imports System.Data.Common
1+ Imports System.Data.Common
22Imports Databasic.ActiveRecord
33
44Namespace ActiveRecord
5- Partial Public MustInherit Class Entity
5+ Partial Public MustInherit Class Entity
66
7- ''' <summary>
8- ''' Get column names from reader as list of strings.
9- ''' </summary>
10- ''' <param name="reader"></param>
11- ''' <returns></returns>
12- Private Shared Function _getReaderRowColumns(reader As DbDataReader) As List( Of String )
13- Return Enumerable.ToList( Of String )(
14- Enumerable.Select( Of Integer , String )(
15- Enumerable.Range( 0 , reader.FieldCount),
16- New Func( Of Integer , String )( AddressOf reader.GetName)
17- )
18- )
19- End Function
20- ''' <summary>
21- ''' Return True if type is descriptable type by custom attributes, not primitive, not an object.
22- ''' </summary>
23- ''' <param name="instanceType">Instance type to check out.</param>
24- ''' <returns>True if descriptable.</returns>
25- Private Shared Function _isDescriptableType( ByRef instanceType As Type) As Boolean
26- Return Not instanceType.IsPrimitive AndAlso instanceType.FullName <> "System.String" AndAlso instanceType.FullName <> "System.Object"
27- End Function
28- ''' <summary>
29- ''' Set up current reader row columns into instance properties and fields.
30- ''' </summary>
31- ''' <param name="reader">DbDataReader with current row moved, where current row will be used to fill instance properties and fields.</param>
32- ''' <param name="readerColumnNames">Columns in reader in proper order.</param>
33- ''' <param name="instance">Instance to fill.</param>
34- Private Shared Sub _readerRowToInstance( ByRef reader As DbDataReader, ByRef readerColumnNames As List( Of String ), ByRef columnsByDbNames As Dictionary( Of String , Databasic.MemberInfo), ByRef instance As Object , isEntity As Boolean )
35- Dim mi As Databasic.MemberInfo
36- Dim rawValueTypeCode As TypeCode
37- Dim assigned As Boolean
38- Dim propInfo As Reflection.PropertyInfo
39- Dim targetName As String
40- Dim formatProvider As IFormatProvider
41- Dim rawValue As Object
42- Dim targetValue As Object
43- Dim entity As Databasic.ActiveRecord.Entity
44- For Each readerColumnName As String In readerColumnNames
45- assigned = False
46- rawValue = reader(readerColumnName)
47- targetName = readerColumnName
48- targetValue = Nothing
49- If columnsByDbNames.ContainsKey(readerColumnName) Then
50- mi = columnsByDbNames(readerColumnName)
51- rawValueTypeCode = Type.GetTypeCode(rawValue.GetType())
52- If (rawValueTypeCode = Constants.StringTypeCode AndAlso mi.TrimChars.Length > 0 ) Then
53- rawValue = rawValue.ToString().Trim(mi.TrimChars)
54- ElseIf rawValueTypeCode = Type.GetTypeCode(mi.Type) Then
55- targetValue = rawValue
56- ElseIf mi.Type.IsEnum Then
57- targetValue = System.[Enum].Parse(mi.Type, rawValue.ToString())
58- Else
59- formatProvider = If (mi.FormatProvider, System.Globalization.CultureInfo.CurrentCulture)
60- targetValue = If ( TypeOf rawValue Is DBNull, Nothing , Convert.ChangeType(rawValue, mi.Type, formatProvider))
61- End If
62- If (mi.MemberInfoType = MemberInfoType.Prop) Then
63- propInfo = DirectCast (mi.MemberInfo, Reflection.PropertyInfo)
64- If propInfo.CanWrite Then
65- propInfo.SetValue(instance, targetValue, Nothing )
66- assigned = True
67- Else
68- targetName = mi.Name
69- End If
70- Else
71- DirectCast (mi.MemberInfo, Reflection.FieldInfo).SetValue(instance, targetValue)
72- assigned = True
73- End If
74- End If
75- If isEntity Then
76- targetValue = If (targetValue, rawValue)
77- entity = DirectCast (instance, Databasic.ActiveRecord.Entity)
78- If Not assigned Then
79- entity._reserveStore.Item(targetName) = targetValue
80- End If
81- If entity._initialData.ContainsKey(targetName) Then
82- entity._initialData(targetName) = targetValue
83- Else
84- entity._initialData.Add(targetName, targetValue)
85- End If
86- End If
87- Next
88- End Sub
7+ ''' <summary>
8+ ''' Get column names from reader as list of strings.
9+ ''' </summary>
10+ ''' <param name="reader"></param>
11+ ''' <returns></returns>
12+ Private Shared Function _getReaderRowColumns(reader As DbDataReader) As List( Of String )
13+ Return Enumerable.ToList( Of String )(
14+ Enumerable.Select( Of Integer , String )(
15+ Enumerable.Range( 0 , reader.FieldCount),
16+ New Func( Of Integer , String )( AddressOf reader.GetName)
17+ )
18+ )
19+ End Function
20+ ''' <summary>
21+ ''' Set up current reader row columns into instance properties and fields.
22+ ''' </summary>
23+ ''' <param name="reader">DbDataReader with current row moved, where current row will be used to fill instance properties and fields.</param>
24+ ''' <param name="readerColumnNames">Columns in reader in proper order.</param>
25+ ''' <param name="instance">Instance to fill.</param>
26+ Private Shared Sub _readerRowToTypedInstance(
27+ ByRef reader As DbDataReader,
28+ ByRef readerColumnNames As List( Of String ),
29+ ByRef columnsByDbNames As Dictionary( Of String , Databasic.MemberInfo),
30+ ByRef instance As Object ,
31+ isEntity As Boolean
32+ )
33+ Dim mi As Databasic.MemberInfo
34+ Dim rawValueTypeCode As TypeCode
35+ Dim assigned As Boolean
36+ Dim propInfo As Reflection.PropertyInfo
37+ Dim targetName As String
38+ Dim formatProvider As IFormatProvider
39+ Dim rawValue As Object
40+ Dim targetValue As Object
41+ For Each readerColumnName As String In readerColumnNames
42+ assigned = False
43+ rawValue = reader(readerColumnName)
44+ targetName = readerColumnName
45+ targetValue = Nothing
46+ If columnsByDbNames.ContainsKey(readerColumnName) Then
47+ mi = columnsByDbNames(readerColumnName)
48+ rawValueTypeCode = Type.GetTypeCode(rawValue.GetType())
49+ If (rawValueTypeCode = Constants.StringTypeCode AndAlso mi.TrimChars.Length > 0 ) Then
50+ rawValue = rawValue.ToString().Trim(mi.TrimChars)
51+ ElseIf rawValueTypeCode = Type.GetTypeCode(mi.Type) Then
52+ targetValue = rawValue
53+ ElseIf mi.Type.IsEnum Then
54+ targetValue = Entity._parseEnumMemberValue(mi, rawValue)
55+ Else
56+ formatProvider = If (mi.FormatProvider, System.Globalization.CultureInfo.CurrentCulture)
57+ targetValue = If ( TypeOf rawValue Is DBNull, Nothing , Convert.ChangeType(rawValue, mi.Type, formatProvider))
58+ End If
59+ If (mi.MemberInfoType = MemberInfoType.Prop) Then
60+ propInfo = DirectCast (mi.MemberInfo, Reflection.PropertyInfo)
61+ If propInfo.CanWrite Then
62+ propInfo.SetValue(instance, targetValue, Nothing )
63+ assigned = True
64+ End If
65+ Else
66+ DirectCast (mi.MemberInfo, Reflection.FieldInfo).SetValue(instance, targetValue)
67+ assigned = True
68+ End If
69+ targetName = mi.Name
70+ End If
71+ If isEntity Then
72+ Entity._setUpentityValueToReserveStoreAndInitialValues(
73+ DirectCast (instance, Databasic.ActiveRecord.Entity),
74+ targetName, rawValue, targetValue, assigned
75+ )
76+ End If
77+ Next
78+ End Sub
8979
90- End Class
80+ Private Shared Sub _readerRowToAnonymousInstance(
81+ ByRef reader As DbDataReader,
82+ ByRef readerColumnNames As List( Of String ),
83+ ByRef instance As Databasic.Object
84+ )
85+ For Each readerColumnName As String In readerColumnNames
86+ Entity._setUpentityValueToReserveStoreAndInitialValues(
87+ instance, readerColumnName, Nothing , reader(readerColumnName), False
88+ )
89+ Next
90+ End Sub
91+
92+ Private Shared Function _parseEnumMemberValue(mi As MemberInfo, rawValue As Object ) As Object
93+ If mi.UseEnumUnderlyingValue Then
94+ Dim underType As Type = System.Enum.GetUnderlyingType(mi.Type),
95+ underValue = Convert.ChangeType(rawValue, underType),
96+ values = System.[Enum].GetValues(mi.Type)
97+ For i = 0 To values.Length - 1
98+ If (underValue = values(i)) Then
99+ Return values(i)
100+ End If
101+ Next
102+ Return Nothing
103+ Else
104+ Return System.[Enum].Parse(mi.Type, rawValue.ToString())
105+ End If
106+ End Function
107+
108+ Private Shared Sub _setUpentityValueToReserveStoreAndInitialValues(
109+ entity As Databasic.ActiveRecord.Entity,
110+ targetName As String ,
111+ rawValue As Object ,
112+ targetValue As Object ,
113+ assigned As Boolean
114+ )
115+ targetValue = If (targetValue, rawValue)
116+ If Not assigned Then
117+ entity._reserveStore.Item(targetName) = targetValue
118+ End If
119+ If entity._initialData.ContainsKey(targetName) Then
120+ entity._initialData(targetName) = targetValue
121+ Else
122+ entity._initialData.Add(targetName, targetValue)
123+ End If
124+ End Sub
125+
126+ End Class
91127End Namespace
0 commit comments