Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 892245d

Browse files
committed
Merge pull request #303 from fvoncina/prevent-first-chance-exceptions
Prevent raising inner exceptions while IDataReader tries to get ordinal for field names.
2 parents a2e3790 + 7012783 commit 892245d

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/ServiceStack.OrmLite/OrmLiteReadExtensions.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ internal static IEnumerable<T> Each<T>(this IDbCommand dbCmd, string filter, par
155155
var fieldDefs = ModelDefinition<T>.Definition.FieldDefinitionsArray;
156156
using (var reader = dbCmd.ExecReader(
157157
OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), filter, filterParams)))
158-
{
159-
var indexCache = new Dictionary<string, int>();
158+
{
159+
var indexCache = reader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
160160
while (reader.Read())
161161
{
162162
var row = OrmLiteUtilExtensions.CreateInstance<T>();
@@ -480,8 +480,8 @@ internal static IEnumerable<T> QueryEach<T>(this IDbCommand dbCmd, string sql, o
480480

481481
var fieldDefs = ModelDefinition<T>.Definition.FieldDefinitionsArray;
482482
using (var reader = dbCmd.ExecuteReader())
483-
{
484-
var indexCache = new Dictionary<string, int>();
483+
{
484+
var indexCache = reader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
485485
while (reader.Read())
486486
{
487487
var row = OrmLiteUtilExtensions.CreateInstance<T>();
@@ -497,8 +497,8 @@ internal static IEnumerable<T> EachWhere<T>(this IDbCommand dbCmd, object anonTy
497497

498498
var fieldDefs = ModelDefinition<T>.Definition.FieldDefinitionsArray;
499499
using (var reader = dbCmd.ExecuteReader())
500-
{
501-
var indexCache = new Dictionary<string, int>();
500+
{
501+
var indexCache = reader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
502502
while (reader.Read())
503503
{
504504
var row = OrmLiteUtilExtensions.CreateInstance<T>();

src/ServiceStack.OrmLite/OrmLiteUtilExtensions.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public static T ConvertTo<T>(this IDataReader dataReader)
3434
if (dataReader.Read())
3535
{
3636
var row = CreateInstance<T>();
37-
row.PopulateWithSqlReader(dataReader, fieldDefs, null);
37+
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
38+
row.PopulateWithSqlReader(dataReader, fieldDefs, indexCache);
3839
return row;
3940
}
4041
return default(T);
@@ -48,7 +49,7 @@ public static List<T> ConvertToList<T>(this IDataReader dataReader)
4849
var to = new List<T>();
4950
using (dataReader)
5051
{
51-
var indexCache = new Dictionary<string, int>();
52+
var indexCache = dataReader.GetIndexFieldsCache(ModelDefinition<T>.Definition);
5253
while (dataReader.Read())
5354
{
5455
var row = CreateInstance<T>();
@@ -149,5 +150,26 @@ public static SqlInValues SqlInValues<T>(this T[] values)
149150
{
150151
return new SqlInValues(values);
151152
}
153+
154+
public static Dictionary<string, int> GetIndexFieldsCache(this IDataReader reader, ModelDefinition modelDefinition = null)
155+
{
156+
var rv = new Dictionary<string, int>();
157+
for (var i = 0; i < reader.FieldCount; i++)
158+
{
159+
rv.Add(reader.GetName(i), i);
160+
}
161+
if (modelDefinition != null)
162+
{
163+
modelDefinition.IgnoredFieldDefinitions.ForEach(field =>
164+
{
165+
if (!rv.ContainsKey(field.FieldName))
166+
{
167+
rv.Add(field.FieldName, -1);
168+
}
169+
});
170+
}
171+
return rv;
172+
}
173+
152174
}
153175
}

0 commit comments

Comments
 (0)