Skip to content

Commit 48ce36b

Browse files
committed
Handle DbDataReaders that do not support GetSchemaTable
1 parent b104ae1 commit 48ce36b

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

src/NHibernate/Async/Driver/NDataReader.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@ private partial class NResult
8787
internal static async Task<NResult> CreateAsync(DbDataReader reader, bool isMidstream, CancellationToken cancellationToken)
8888
{
8989
cancellationToken.ThrowIfCancellationRequested();
90+
var schemaTable = SafeGetSchemaTable(reader, out var exception);
9091
var result = new NResult
9192
{
92-
schemaTable = reader.GetSchemaTable()
93+
schemaTable = schemaTable,
94+
schemaTableNotSupportedException = exception
9395
};
9496

9597
List<object[]> recordsList = new List<object[]>();

src/NHibernate/Driver/NDataReader.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ private partial class NResult
488488
private int colCount = 0;
489489

490490
private DataTable schemaTable;
491+
private NotSupportedException schemaTableNotSupportedException;
491492

492493
// key = field name
493494
// index = field index
@@ -508,9 +509,11 @@ private NResult() { }
508509
/// </param>
509510
internal static NResult Create(DbDataReader reader, bool isMidstream)
510511
{
512+
var schemaTable = SafeGetSchemaTable(reader, out var exception);
511513
var result = new NResult
512514
{
513-
schemaTable = reader.GetSchemaTable()
515+
schemaTable = schemaTable,
516+
schemaTableNotSupportedException = exception
514517
};
515518

516519
List<object[]> recordsList = new List<object[]>();
@@ -549,6 +552,22 @@ internal static NResult Create(DbDataReader reader, bool isMidstream)
549552
return result;
550553
}
551554

555+
556+
private static DataTable SafeGetSchemaTable(IDataReader reader, out NotSupportedException exception)
557+
{
558+
exception = null;
559+
try
560+
{
561+
return reader.GetSchemaTable();
562+
}
563+
catch (NotSupportedException e)
564+
{
565+
ReflectHelper.PreserveStackTrace(e);
566+
exception = e;
567+
return null;
568+
}
569+
}
570+
552571
/// <summary>
553572
///
554573
/// </summary>
@@ -591,6 +610,8 @@ public string GetName(int colIndex)
591610
/// <summary></summary>
592611
public DataTable GetSchemaTable()
593612
{
613+
if (schemaTableNotSupportedException != null)
614+
throw schemaTableNotSupportedException;
594615
return schemaTable;
595616
}
596617

src/NHibernate/Loader/Loader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1424,7 +1424,7 @@ private ColumnNameCache RetreiveColumnNameToIndexCache(DbDataReader rs)
14241424
if (_columnNameCache == null)
14251425
{
14261426
Log.Debug("Building columnName->columnIndex cache");
1427-
_columnNameCache = new ColumnNameCache(rs.GetSchemaTable().Rows.Count);
1427+
_columnNameCache = new ColumnNameCache(rs.FieldCount);
14281428
}
14291429

14301430
return _columnNameCache;

0 commit comments

Comments
 (0)