Skip to content

Commit 2b8c35e

Browse files
David EllingsworthDavid Ellingsworth
authored andcommitted
GH-3530: The SAP SqlAnywhere driver does not implement DbDataReader.GetChar and incorrectly uses Convert without specifying an IFormatProvider. Wrap the SAP SqlAnywhere DbDataReader in a SqlAnywhereDbDataReader to correct these issues.
1 parent b94e807 commit 2b8c35e

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using System;
2+
using System.Data.Common;
3+
using System.Globalization;
4+
5+
namespace NHibernate.AdoNet
6+
{
7+
/// <summary>
8+
/// This is a wrapper for the DbDataReader returned by the SqlAnywhere driver.
9+
/// The DbDataReader in the SqlAnywhere driver does not support the GetChar method,
10+
/// and uses Convert.To* without specifying an <see cref="IFormatProvider"/>.
11+
/// </summary>
12+
public class SqlAnywhereDbDataReader : NoCharDbDataReader
13+
{
14+
public SqlAnywhereDbDataReader(DbDataReader reader) : base(reader) { }
15+
16+
public override float GetFloat(int ordinal)
17+
{
18+
var value = DataReader[ordinal];
19+
20+
return value switch
21+
{
22+
string s => float.Parse(s, CultureInfo.InvariantCulture),
23+
_ => (float) value
24+
};
25+
}
26+
27+
public override double GetDouble(int ordinal)
28+
{
29+
var value = DataReader[ordinal];
30+
31+
return value switch
32+
{
33+
string s => double.Parse(s, CultureInfo.InvariantCulture),
34+
_ => (double) value
35+
};
36+
}
37+
38+
public override decimal GetDecimal(int ordinal)
39+
{
40+
var value = DataReader[ordinal];
41+
42+
return value switch
43+
{
44+
string s => decimal.Parse(s, CultureInfo.InvariantCulture),
45+
_ => (decimal) value
46+
};
47+
}
48+
49+
public override DateTime GetDateTime(int ordinal)
50+
{
51+
var value = DataReader[ordinal];
52+
53+
return value switch
54+
{
55+
string s => DateTime.Parse(s, CultureInfo.InvariantCulture),
56+
_ => (DateTime) value
57+
};
58+
}
59+
}
60+
}

src/NHibernate/Async/Driver/SapSQLAnywhere17Driver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public override async Task<DbDataReader> ExecuteReaderAsync(DbCommand command, C
2323
cancellationToken.ThrowIfCancellationRequested();
2424
var reader = await (command.ExecuteReaderAsync(cancellationToken)).ConfigureAwait(false);
2525

26-
return new NoCharDbDataReader(reader);
26+
return new SqlAnywhereDbDataReader(reader);
2727
}
2828
}
2929
}

src/NHibernate/Driver/SapSQLAnywhere17Driver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public override DbDataReader ExecuteReader(DbCommand command)
2222
{
2323
var reader = command.ExecuteReader();
2424

25-
return new NoCharDbDataReader(reader);
25+
return new SqlAnywhereDbDataReader(reader);
2626
}
2727
}
2828
}

0 commit comments

Comments
 (0)