Skip to content

Commit efb23f6

Browse files
committed
Add GetX(string name) overloads. Fixes #435
1 parent 9fbb2bf commit efb23f6

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,26 +176,34 @@ private async Task<ResultSet> ScanResultSetAsyncAwaited(IOBehavior ioBehavior, R
176176
public override int GetOrdinal(string name) => GetResultSet().GetOrdinal(name);
177177

178178
public override bool GetBoolean(int ordinal) => GetResultSet().GetCurrentRow().GetBoolean(ordinal);
179+
public bool GetBoolean(string name) => GetBoolean(GetOrdinal(name));
179180

180181
public override byte GetByte(int ordinal) => GetResultSet().GetCurrentRow().GetByte(ordinal);
182+
public byte GetByte(string name) => GetByte(GetOrdinal(name));
181183

182184
public sbyte GetSByte(int ordinal) => GetResultSet().GetCurrentRow().GetSByte(ordinal);
185+
public sbyte GetSByte(string name) => GetSByte(GetOrdinal(name));
183186

184187
public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length)
185188
=> GetResultSet().GetCurrentRow().GetBytes(ordinal, dataOffset, buffer, bufferOffset, length);
186189

187190
public override char GetChar(int ordinal) => GetResultSet().GetCurrentRow().GetChar(ordinal);
191+
public char GetChar(string name) => GetChar(GetOrdinal(name));
188192

189193
public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length)
190194
=> GetResultSet().GetCurrentRow().GetChars(ordinal, dataOffset, buffer, bufferOffset, length);
191195

192196
public override Guid GetGuid(int ordinal) => GetResultSet().GetCurrentRow().GetGuid(ordinal);
197+
public Guid GetGuid(string name) => GetGuid(GetOrdinal(name));
193198

194199
public override short GetInt16(int ordinal) => GetResultSet().GetCurrentRow().GetInt16(ordinal);
200+
public short GetInt16(string name) => GetInt16(GetOrdinal(name));
195201

196202
public override int GetInt32(int ordinal) => GetResultSet().GetCurrentRow().GetInt32(ordinal);
203+
public int GetInt32(string name) => GetInt32(GetOrdinal(name));
197204

198205
public override long GetInt64(int ordinal) => GetResultSet().GetCurrentRow().GetInt64(ordinal);
206+
public long GetInt64(string name) => GetInt64(GetOrdinal(name));
199207

200208
public override string GetDataTypeName(int ordinal) => GetResultSet().GetDataTypeName(ordinal);
201209

@@ -210,16 +218,22 @@ public override long GetChars(int ordinal, long dataOffset, char[] buffer, int b
210218
protected override DbDataReader GetDbDataReader(int ordinal) => throw new NotSupportedException();
211219

212220
public override DateTime GetDateTime(int ordinal) => GetResultSet().GetCurrentRow().GetDateTime(ordinal);
221+
public DateTime GetDateTime(string name) => GetDateTime(GetOrdinal(name));
213222

214223
public DateTimeOffset GetDateTimeOffset(int ordinal) => GetResultSet().GetCurrentRow().GetDateTimeOffset(ordinal);
224+
public DateTimeOffset GetDateTimeOffset(string name) => GetDateTimeOffset(GetOrdinal(name));
215225

216226
public override string GetString(int ordinal) => GetResultSet().GetCurrentRow().GetString(ordinal);
227+
public string GetString(string name) => GetString(GetOrdinal(name));
217228

218229
public override decimal GetDecimal(int ordinal) => GetResultSet().GetCurrentRow().GetDecimal(ordinal);
230+
public decimal GetDecimal(string name) => GetDecimal(GetOrdinal(name));
219231

220232
public override double GetDouble(int ordinal) => GetResultSet().GetCurrentRow().GetDouble(ordinal);
233+
public double GetDouble(string name) => GetDouble(GetOrdinal(name));
221234

222235
public override float GetFloat(int ordinal) => GetResultSet().GetCurrentRow().GetFloat(ordinal);
236+
public float GetFloat(string name) => GetFloat(GetOrdinal(name));
223237

224238
public override int VisibleFieldCount => FieldCount;
225239

tests/SideBySide/DataTypes.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void Dispose()
4848
[InlineData("UInt64", new[] { 1, 0, 0, 0, 0 }, new[] { false, false, false, true, true })]
4949
public async Task GetBoolean(string column, int[] flags, bool[] values)
5050
{
51-
await DoGetValue(column, (r, n) => r.GetBoolean(n), flags, values).ConfigureAwait(false);
51+
await DoGetValue(column, (r, n) => r.GetBoolean(n), (r, s) => r.GetBoolean(s), flags, values).ConfigureAwait(false);
5252
}
5353

5454
[Theory]
@@ -64,7 +64,7 @@ public async Task GetBoolean(string column, int[] flags, bool[] values)
6464
[InlineData("UInt64", new[] { 1, 0, 0, 2, 2 }, new short[] { 0, 0, 0, 0, 0 })]
6565
public async Task GetInt16(string column, int[] flags, short[] values)
6666
{
67-
await DoGetValue(column, (r, n) => r.GetInt16(n), flags, values).ConfigureAwait(false);
67+
await DoGetValue(column, (r, n) => r.GetInt16(n), (r, s) => r.GetInt16(s), flags, values).ConfigureAwait(false);
6868
}
6969

7070
[Theory]
@@ -80,7 +80,7 @@ public async Task GetInt16(string column, int[] flags, short[] values)
8080
[InlineData("UInt64", new[] { 1, 0, 0, 2, 2 }, new[] { 0, 0, 0, 0, 0 })]
8181
public async Task GetInt32(string column, int[] flags, int[] values)
8282
{
83-
await DoGetValue(column, (r, n) => r.GetInt32(n), flags, values).ConfigureAwait(false);
83+
await DoGetValue(column, (r, n) => r.GetInt32(n), (r, s) => r.GetInt32(s), flags, values).ConfigureAwait(false);
8484
}
8585

8686
[Theory]
@@ -96,15 +96,15 @@ public async Task GetInt32(string column, int[] flags, int[] values)
9696
[InlineData("UInt64", new[] { 1, 0, 0, 2, 0 }, new[] { 0L, 0, 0, 0, 1234567890123456789 })]
9797
public async Task GetInt64(string column, int[] flags, long[] values)
9898
{
99-
await DoGetValue(column, (r, n) => r.GetInt64(n), flags, values).ConfigureAwait(false);
99+
await DoGetValue(column, (r, n) => r.GetInt64(n), (r, s) => r.GetInt64(s), flags, values).ConfigureAwait(false);
100100
}
101101

102-
private async Task DoGetValue<T>(string column, Func<DbDataReader, int, T> getInt, int[] flags, T[] values)
102+
private async Task DoGetValue<T>(string column, Func<DbDataReader, int, T> getInt, Func<MySqlDataReader, string, T> getIntByName, int[] flags, T[] values)
103103
{
104104
using (var cmd = m_database.Connection.CreateCommand())
105105
{
106106
cmd.CommandText = $"select {column} from datatypes_integers order by rowid";
107-
using (var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false))
107+
using (var reader = (MySqlDataReader) await cmd.ExecuteReaderAsync().ConfigureAwait(false))
108108
{
109109
for (int i = 0; i < flags.Length; i++)
110110
{
@@ -113,6 +113,7 @@ private async Task DoGetValue<T>(string column, Func<DbDataReader, int, T> getIn
113113
{
114114
case 0: // normal
115115
Assert.Equal(values[i], getInt(reader, 0));
116+
Assert.Equal(values[i], getIntByName(reader, column));
116117
break;
117118

118119
case 1: // null
@@ -121,6 +122,7 @@ private async Task DoGetValue<T>(string column, Func<DbDataReader, int, T> getIn
121122

122123
case 2: // overflow
123124
Assert.Throws<OverflowException>(() => getInt(reader, 0));
125+
Assert.Throws<OverflowException>(() => getIntByName(reader, column));
124126
break;
125127
}
126128
}
@@ -150,7 +152,7 @@ public void QuerySet(string column, string dataTypeName, object[] expected)
150152
// mysql-connector-net incorrectly returns "VARCHAR" for "ENUM"
151153
dataTypeName = "VARCHAR";
152154
#endif
153-
DoQuery("set", column, dataTypeName, expected, reader => reader.GetString(0));
155+
DoQuery("set", column, dataTypeName, expected, reader => reader.GetString(column));
154156
}
155157

156158
[SkippableTheory(Baseline = "https://bugs.mysql.com/bug.php?id=78917")]
@@ -171,15 +173,15 @@ public void QueryTinyIntSbyte(string column, string dataTypeName, object[] expec
171173
using (var connection = new MySqlConnection(csb.ConnectionString))
172174
{
173175
connection.Open();
174-
DoQuery("bools", column, dataTypeName, expected, reader => ((MySqlDataReader) reader).GetSByte(0), baselineCoercedNullValue: default(sbyte), connection: connection);
176+
DoQuery("bools", column, dataTypeName, expected, reader => reader.GetSByte(0), baselineCoercedNullValue: default(sbyte), connection: connection);
175177
}
176178
}
177179

178180
[Theory]
179181
[InlineData("SByte", "TINYINT", new object[] { null, default(sbyte), sbyte.MinValue, sbyte.MaxValue, (sbyte) 123 })]
180182
public void QuerySByte(string column, string dataTypeName, object[] expected)
181183
{
182-
DoQuery("integers", column, dataTypeName, expected, reader => ((MySqlDataReader) reader).GetSByte(0), baselineCoercedNullValue: default(sbyte));
184+
DoQuery("integers", column, dataTypeName, expected, reader => reader.GetSByte(column), baselineCoercedNullValue: default(sbyte));
183185
}
184186

185187
[Theory]
@@ -342,14 +344,14 @@ public void QueryBinaryGuid(bool oldGuids)
342344
{
343345
Assert.Equal(typeof(string), reader.GetFieldType(0));
344346
Assert.Equal("00000000-0000-0000-0000-000000000000", reader.GetValue(0));
345-
Assert.Equal("00000000-0000-0000-0000-000000000000", reader.GetString(0));
347+
Assert.Equal("00000000-0000-0000-0000-000000000000", reader.GetString("guidbin"));
346348
}
347349
else
348350
{
349351
Assert.Equal(typeof(Guid), reader.GetFieldType(0));
350352
Assert.Equal(Guid.Empty, reader.GetValue(0));
351353
}
352-
Assert.Equal(Guid.Empty, reader.GetGuid(0));
354+
Assert.Equal(Guid.Empty, reader.GetGuid("guidbin"));
353355
}
354356
}
355357
}
@@ -423,9 +425,9 @@ public async Task GetGuid(string column, Type fieldType)
423425
[InlineData("`Timestamp`", "TIMESTAMP", new object[] { null, "1970 01 01 0 0 1", "2038 1 18 3 14 7 999999", null, "2016 4 5 14 3 4 567890" })]
424426
public void QueryDate(string column, string dataTypeName, object[] expected)
425427
{
426-
DoQuery("times", column, dataTypeName, ConvertToDateTime(expected), reader => reader.GetDateTime(0));
428+
DoQuery("times", column, dataTypeName, ConvertToDateTime(expected), reader => reader.GetDateTime(column.Replace("`", "")));
427429
#if !BASELINE
428-
DoQuery("times", column, dataTypeName, ConvertToDateTimeOffset(expected), reader => (reader as MySqlDataReader).GetDateTimeOffset(0), matchesDefaultType: false);
430+
DoQuery("times", column, dataTypeName, ConvertToDateTimeOffset(expected), reader => reader.GetDateTimeOffset(0), matchesDefaultType: false);
429431
#endif
430432
}
431433

@@ -881,7 +883,7 @@ private void DoQuery(
881883
string column,
882884
string dataTypeName,
883885
object[] expected,
884-
Func<DbDataReader, object> getValue,
886+
Func<MySqlDataReader, object> getValue,
885887
object baselineCoercedNullValue = null,
886888
bool omitWhereTest = false,
887889
bool matchesDefaultType = true,
@@ -897,7 +899,7 @@ private void DoQuery<TException>(
897899
string column,
898900
string dataTypeName,
899901
object[] expected,
900-
Func<DbDataReader, object> getValue,
902+
Func<MySqlDataReader, object> getValue,
901903
object baselineCoercedNullValue = null,
902904
bool omitWhereTest = false,
903905
bool matchesDefaultType = true,

0 commit comments

Comments
 (0)