Skip to content

Commit 5553ed3

Browse files
authored
Merge pull request #48 from opejanovic/master
Fixing converting Boolean, TimeStamp, Date and Byte to .NET native data types
2 parents 431b6b5 + 347c683 commit 5553ed3

File tree

2 files changed

+124
-6
lines changed

2 files changed

+124
-6
lines changed

src/Dapper.Oracle/OracleValueConverter.cs

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,32 +58,66 @@ private static T ConvertArray<T>(object value)
5858
var nullableType = Nullable.GetUnderlyingType(typeof(T));
5959
var arr = (Array)value;
6060

61+
62+
if (typeof(T) == typeof(DateTime[]))
63+
{
64+
var dateArray = new DateTime[arr.Length];
65+
for (int i = 0; i < arr.Length; i++)
66+
{
67+
var oraDate = arr.GetValue(i);
68+
var date = (DateTime)oraDate.GetType().GetProperty("Value").GetValue(oraDate, null);
69+
dateArray[i] = date;
70+
}
71+
return (T)System.Convert.ChangeType(dateArray, nullableType ?? typeof(T));
72+
}
73+
74+
if (typeof(T) == typeof(DateTime?[]))
75+
{
76+
var dateArray = new DateTime?[arr.Length];
77+
for (int i = 0; i < arr.Length; i++)
78+
{
79+
var oraDate = arr.GetValue(i);
80+
dateArray[i] = null;
81+
82+
if (oraDate != null)
83+
{
84+
var isOraDateValNull = (bool)oraDate?.GetType()?.GetProperty("IsNull")?.GetValue(oraDate, null);
85+
if(!isOraDateValNull)
86+
{
87+
dateArray[i] = (DateTime?)oraDate?.GetType()?.GetProperty("Value")?.GetValue(oraDate, null);
88+
}
89+
}
90+
}
91+
return (T)System.Convert.ChangeType(dateArray, nullableType ?? typeof(T));
92+
}
93+
6194
switch (typeof(T).FullName)
6295
{
6396
case "Oracle.ManagedDataAccess.Types.OracleString[]":
97+
case "System.Byte[]":
6498
return (T)System.Convert.ChangeType(value, nullableType ?? typeof(T));
6599

66100
case "System.Int16[]":
67101
var shortArray = new short[arr.Length];
68102
for (int i = 0; i < arr.Length; i++)
69103
{
70-
shortArray[i] = short.Parse(arr.GetValue(i).ToString());
104+
shortArray[i] = short.Parse(arr.GetValue(i)?.ToString());
71105
}
72106
return (T)System.Convert.ChangeType(shortArray, nullableType ?? typeof(T));
73107

74108
case "System.Int32[]":
75109
var intArray = new int[arr.Length];
76110
for (int i = 0; i < arr.Length; i++)
77111
{
78-
intArray[i] = int.Parse(arr.GetValue(i).ToString());
112+
intArray[i] = int.Parse(arr.GetValue(i)?.ToString());
79113
}
80114
return (T)System.Convert.ChangeType(intArray, nullableType ?? typeof(T));
81115

82116
case "System.Int64[]":
83117
var longArray = new long[arr.Length];
84118
for (int i = 0; i < arr.Length; i++)
85119
{
86-
longArray[i] = long.Parse(arr.GetValue(i).ToString());
120+
longArray[i] = long.Parse(arr.GetValue(i)?.ToString());
87121
}
88122
return (T)System.Convert.ChangeType(longArray, nullableType ?? typeof(T));
89123

@@ -92,15 +126,21 @@ private static T ConvertArray<T>(object value)
92126
var decimalArray = new decimal[arr.Length];
93127
for (int i = 0; i < arr.Length; i++)
94128
{
95-
decimalArray[i] = decimal.Parse(arr.GetValue(i).ToString());
129+
decimalArray[i] = decimal.Parse(arr.GetValue(i)?.ToString());
96130
}
97131
return (T)System.Convert.ChangeType(decimalArray, nullableType ?? typeof(T));
98-
132+
case "System.Boolean[]":
133+
var boolArray = new bool[arr.Length];
134+
for (int i = 0; i < arr.Length; i++)
135+
{
136+
boolArray[i] = bool.Parse(arr.GetValue(i)?.ToString());
137+
}
138+
return (T)System.Convert.ChangeType(boolArray, nullableType ?? typeof(T));
99139
default:
100140
var strArray = new string[arr.Length];
101141
for (int i = 0; i < arr.Length; i++)
102142
{
103-
strArray[i] = arr.GetValue(i).ToString();
143+
strArray[i] = arr.GetValue(i)?.ToString();
104144
}
105145
return (T)System.Convert.ChangeType(strArray, nullableType ?? typeof(T));
106146
}

src/Tests.Dapper.Oracle/OracleValueConverterTests.cs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Text;
33
using Dapper.Oracle;
44
using FluentAssertions;
5+
using Oracle.ManagedDataAccess.Client;
56
#if NETCOREAPP2_0
67
using Oracle.ManagedDataAccess.Types;
78
#else
@@ -14,13 +15,90 @@ namespace Tests.Dapper.Oracle
1415
{
1516
public class OracleValueConverterTests
1617
{
18+
[Fact]
19+
public void GetOracleBoolean()
20+
{
21+
var oraBool = new OracleBoolean(true);
22+
var result = OracleValueConverter.Convert<bool>(oraBool);
23+
result.Should().Be(true);
24+
25+
oraBool = new OracleBoolean(-1);
26+
result = OracleValueConverter.Convert<bool>(oraBool);
27+
result.Should().Be(true);
28+
29+
oraBool = new OracleBoolean(1);
30+
result = OracleValueConverter.Convert<bool>(oraBool);
31+
result.Should().Be(true);
32+
33+
oraBool = new OracleBoolean(0);
34+
result = OracleValueConverter.Convert<bool>(oraBool);
35+
result.Should().Be(false);
36+
37+
var oraBoolArr = new OracleBoolean[2] { true, false };
38+
var resultArr = OracleValueConverter.Convert<bool[]>(oraBoolArr);
39+
resultArr.Should().BeOfType<bool[]>();
40+
resultArr.Should().HaveCount(2);
41+
}
42+
43+
[Fact]
44+
public void GetOracleBinary()
45+
{
46+
var bytes = Encoding.UTF8.GetBytes("Lorem ipsum");
47+
var oracleBytes = new OracleBinary(bytes);
48+
var result = OracleValueConverter.Convert<byte[]>(oracleBytes);
49+
result.Should().Equal(bytes);
50+
}
51+
52+
[Fact]
53+
public void GetOracleTimeStamp()
54+
{
55+
var dateNow = DateTime.Now;
56+
var oraTimeStamp = new OracleTimeStamp(dateNow);
57+
var result = OracleValueConverter.Convert<DateTime>(oraTimeStamp);
58+
result.Should().Be(dateNow);
59+
60+
var oraTimeStampArr = new OracleTimeStamp[1] { dateNow };
61+
var secondResult = OracleValueConverter.Convert<DateTime[]>(oraTimeStampArr);
62+
secondResult.Should().BeOfType<DateTime[]>();
63+
secondResult.Should().HaveCount(1);
64+
}
65+
66+
[Fact]
67+
public void GetOracleDateArray()
68+
{
69+
var oraDateArray = new OracleDate[] {
70+
(OracleDate)DateTime.Now,
71+
(OracleDate)DateTime.Now.AddYears(1),
72+
new OracleDate("10/29/2020 16:14:23")
73+
};
74+
75+
var nullableOraDateArray = new OracleDate?[] {
76+
(OracleDate)DateTime.Now,
77+
(OracleDate)DateTime.Now.AddYears(1),
78+
null,
79+
new OracleDate("10/29/2020 16:14:23")
80+
};
81+
var result = OracleValueConverter.Convert<DateTime[]>(oraDateArray);
82+
result.Should().BeOfType<DateTime[]>();
83+
result.Should().HaveCount(oraDateArray.Length);
84+
85+
var secondResult = OracleValueConverter.Convert<DateTime?[]>(nullableOraDateArray);
86+
secondResult.Should().BeOfType<DateTime?[]>();
87+
secondResult.Should().HaveCount(nullableOraDateArray.Length);
88+
}
89+
1790
[Fact]
1891
public void GetStringArray()
1992
{
2093
var oraArray = new[] { "Foo", "Bar" };
2194
var result = OracleValueConverter.Convert<string[]>(oraArray);
2295
result.Should().BeOfType<string[]>();
2396
result.Should().HaveCount(2);
97+
98+
oraArray = new[] { "Foo", "Bar", null };
99+
result = OracleValueConverter.Convert<string[]>(oraArray);
100+
result.Should().BeOfType<string[]>();
101+
result.Should().HaveCount(3);
24102
}
25103

26104
[Fact]

0 commit comments

Comments
 (0)