Skip to content

Commit 253019a

Browse files
committed
Allow GetOrdinal before Read. Fixes #379
1 parent d0ea67a commit 253019a

File tree

4 files changed

+87
-15
lines changed

4 files changed

+87
-15
lines changed

src/MySqlConnector/MySqlClient/MySqlDataReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ private async Task<ResultSet> ScanResultSetAsyncAwaited(IOBehavior ioBehavior, R
171171
public override bool IsClosed => Command == null;
172172
public override int RecordsAffected => m_recordsAffected;
173173

174-
public override int GetOrdinal(string name) => GetResultSet().GetCurrentRow().GetOrdinal(name);
174+
public override int GetOrdinal(string name) => GetResultSet().GetOrdinal(name);
175175

176176
public override bool GetBoolean(int ordinal) => GetResultSet().GetCurrentRow().GetBoolean(ordinal);
177177

src/MySqlConnector/MySqlClient/Results/ResultSet.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,20 @@ public bool HasRows
301301
}
302302
}
303303

304+
public int GetOrdinal(string name)
305+
{
306+
if (name == null)
307+
throw new ArgumentNullException(nameof(name));
308+
309+
for (var column = 0; column < ColumnDefinitions.Length; column++)
310+
{
311+
if (name.Equals(ColumnDefinitions[column].Name, StringComparison.OrdinalIgnoreCase))
312+
return column;
313+
}
314+
315+
throw new IndexOutOfRangeException("The column name '{0}' does not exist in the result set.".FormatInvariant(name));
316+
}
317+
304318
public Row GetCurrentRow()
305319
{
306320
if (State != ResultSetState.ReadingRows)

src/MySqlConnector/MySqlClient/Results/Row.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Buffers;
32
using System.Globalization;
43
using System.Text;
54
using MySql.Data.Serialization;
@@ -232,19 +231,7 @@ public int GetValues(object[] values)
232231

233232
public object this[int ordinal] => GetValue(ordinal);
234233

235-
public object this[string name] => GetValue(GetOrdinal(name));
236-
237-
public int GetOrdinal(string name)
238-
{
239-
for (int column = 0; column < ResultSet.ColumnDefinitions.Length; column++)
240-
{
241-
if (ResultSet.ColumnDefinitions[column].Name.Equals(name, StringComparison.OrdinalIgnoreCase))
242-
return column;
243-
}
244-
245-
// TODO: Correct exception
246-
throw new IndexOutOfRangeException("The column name '{0}' does not exist in the result set.".FormatInvariant(name));
247-
}
234+
public object this[string name] => GetValue(ResultSet.GetOrdinal(name));
248235

249236
public object GetValue(int ordinal)
250237
{

tests/SideBySide/QueryTests.cs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,77 @@ public void Dispose()
2323
m_database.Connection.Close();
2424
}
2525

26+
[Fact]
27+
public void GetOrdinal()
28+
{
29+
using (var cmd = m_database.Connection.CreateCommand())
30+
{
31+
cmd.CommandText = "select 0 as zero, 1 as one;";
32+
using (var reader = cmd.ExecuteReader())
33+
{
34+
Assert.Equal(0, reader.GetOrdinal("zero"));
35+
Assert.Equal(1, reader.GetOrdinal("one"));
36+
}
37+
}
38+
}
39+
40+
[Fact]
41+
public void GetOrdinalIgnoreCase()
42+
{
43+
using (var cmd = m_database.Connection.CreateCommand())
44+
{
45+
cmd.CommandText = "select 0 as zero, 1 as one;";
46+
using (var reader = cmd.ExecuteReader())
47+
{
48+
Assert.Equal(0, reader.GetOrdinal("Zero"));
49+
Assert.Equal(1, reader.GetOrdinal("ONE"));
50+
}
51+
}
52+
}
53+
54+
[Fact]
55+
public void GetOrdinalExceptionForNoColumn()
56+
{
57+
using (var cmd = m_database.Connection.CreateCommand())
58+
{
59+
cmd.CommandText = "select 0 as zero, 1 as one;";
60+
using (var reader = cmd.ExecuteReader())
61+
{
62+
Assert.Throws<IndexOutOfRangeException>(() => reader.GetOrdinal("three"));
63+
}
64+
}
65+
}
66+
67+
[Fact]
68+
public void GetOrdinalExceptionForNull()
69+
{
70+
using (var cmd = m_database.Connection.CreateCommand())
71+
{
72+
cmd.CommandText = "select 0 as zero, 1 as one;";
73+
using (var reader = cmd.ExecuteReader())
74+
{
75+
Assert.Throws<ArgumentNullException>(() => reader.GetOrdinal(null));
76+
}
77+
}
78+
}
79+
80+
[Fact]
81+
public void GetOrdinalBeforeAndAfterRead()
82+
{
83+
using (var cmd = m_database.Connection.CreateCommand())
84+
{
85+
cmd.CommandText = "select 0 as zero, 1 as one;";
86+
using (var reader = cmd.ExecuteReader())
87+
{
88+
Assert.Equal(1, reader.GetOrdinal("one"));
89+
Assert.True(reader.Read());
90+
Assert.Equal(1, reader.GetOrdinal("one"));
91+
Assert.False(reader.Read());
92+
Assert.Equal(1, reader.GetOrdinal("one"));
93+
}
94+
}
95+
}
96+
2697
[Fact]
2798
public void WithoutUserVariables()
2899
{

0 commit comments

Comments
 (0)