Skip to content

Commit bd3906c

Browse files
committed
Improve exceptions for NULL values. Fixes #1092
Fixes the bounds check for out-of-range ordinal values. Signed-off-by: Bradley Grainger <[email protected]>
1 parent 904a80a commit bd3906c

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

src/MySqlConnector/Core/Row.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public Row Clone()
2626

2727
public object GetValue(int ordinal)
2828
{
29-
if (ordinal < 0 || ordinal > ResultSet.ColumnDefinitions!.Length)
30-
throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ResultSet.ColumnDefinitions!.Length));
29+
if (ordinal < 0 || ordinal >= ResultSet.ColumnDefinitions!.Length)
30+
throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ResultSet.ColumnDefinitions!.Length - 1));
3131

3232
if (m_dataOffsets[ordinal] == -1)
3333
return DBNull.Value;
@@ -171,7 +171,7 @@ public Guid GetGuid(int ordinal)
171171
if (value is byte[] { Length: 16 } bytes)
172172
return CreateGuidFromBytes(Connection.GuidFormat, bytes);
173173

174-
throw new InvalidCastException("The value could not be converted to a GUID: {0}".FormatInvariant(value));
174+
return (Guid) value;
175175
}
176176

177177
public short GetInt16(int ordinal)
@@ -203,11 +203,8 @@ public short GetInt16(int ordinal)
203203

204204
public int GetInt32(int ordinal)
205205
{
206-
if (ordinal < 0 || ordinal > ResultSet.ColumnDefinitions!.Length)
207-
throw new ArgumentOutOfRangeException(nameof(ordinal), "value must be between 0 and {0}.".FormatInvariant(ResultSet.ColumnDefinitions!.Length));
208-
209-
if (m_dataOffsets[ordinal] == -1)
210-
throw new InvalidCastException();
206+
if (ordinal < 0 || ordinal >= ResultSet.ColumnDefinitions!.Length || m_dataOffsets[ordinal] == -1)
207+
return (int) GetValue(ordinal);
211208

212209
var columnDefinition = ResultSet.ColumnDefinitions[ordinal];
213210
if (columnDefinition.ColumnType is ColumnType.Decimal or ColumnType.NewDecimal)
@@ -443,6 +440,8 @@ public MySqlGeometry GetMySqlGeometry(int ordinal)
443440

444441
public MySqlDecimal GetMySqlDecimal(int ordinal)
445442
{
443+
if (IsDBNull(ordinal))
444+
return (MySqlDecimal) GetValue(ordinal);
446445
var data = m_data.Slice(m_dataOffsets[ordinal], m_dataLengths[ordinal]).Span;
447446
var columnType = ResultSet.ColumnDefinitions![ordinal].ColumnType;
448447
if (columnType is ColumnType.NewDecimal or ColumnType.Decimal)

0 commit comments

Comments
 (0)