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

Commit 1d22996

Browse files
committed
Add fallback when reading batch row with GetValues() to read fields individually
1 parent 69cffea commit 1d22996

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-1
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System;
2+
using System.Data;
3+
using NUnit.Framework;
4+
using ServiceStack.DataAnnotations;
5+
using ServiceStack.OrmLite.Tests;
6+
using System.Collections.Generic;
7+
using ServiceStack.Text;
8+
9+
namespace ServiceStack.OrmLite.PostgreSQL.Tests.Issues
10+
{
11+
[Alias("color")]
12+
public class ColorModel
13+
{
14+
public string Color { get; set; }
15+
public string Value { get; set; }
16+
}
17+
18+
public class ColorJsonModel
19+
{
20+
public int Id { get; set; }
21+
public string ColorJson { get; set; }
22+
}
23+
24+
public class OrmLiteModelArrayTests : OrmLiteTestBase
25+
{
26+
public OrmLiteModelArrayTests() : base(Dialect.PostgreSql) {}
27+
28+
[Test]
29+
public void test_model_with_array_to_json()
30+
{
31+
using (var db = OpenDbConnection())
32+
{
33+
db.DropAndCreateTable<ColorModel>();
34+
35+
db.Insert(new ColorModel { Color = "red", Value = "#f00" });
36+
db.Insert(new ColorModel { Color = "green", Value = "#0f0" });
37+
db.Insert(new ColorModel { Color = "blue", Value = "#00f" });
38+
db.Insert(new ColorModel { Color = "cyan", Value = "#0ff" });
39+
db.Insert(new ColorModel { Color = "magenta", Value = "#f0f" });
40+
db.Insert(new ColorModel { Color = "yellow", Value = "#ff0" });
41+
db.Insert(new ColorModel { Color = "black", Value = "#000" });
42+
43+
const string sql = @"SELECT 1::integer AS id
44+
, json_agg(color.*) AS color_json
45+
FROM color;";
46+
47+
var results = db.Select<ColorJsonModel>(sql);
48+
49+
//results.PrintDump();
50+
51+
Assert.That(results.Count, Is.EqualTo(1));
52+
53+
foreach (var result in results)
54+
{
55+
Assert.That(result.Id, Is.EqualTo(1));
56+
Assert.That(result.ColorJson, Is.Not.Null);
57+
}
58+
59+
}
60+
}
61+
62+
[Test]
63+
public void test_model_with_array_and_json()
64+
{
65+
//OrmLiteConfig.DeoptimizeReader = true;
66+
67+
using (var db = OpenDbConnection())
68+
{
69+
db.DropAndCreateTable<ColorModel>();
70+
71+
db.Insert(new ColorModel { Color = "red", Value = "#f00" });
72+
db.Insert(new ColorModel { Color = "green", Value = "#0f0" });
73+
db.Insert(new ColorModel { Color = "blue", Value = "#00f" });
74+
db.Insert(new ColorModel { Color = "cyan", Value = "#0ff" });
75+
db.Insert(new ColorModel { Color = "magenta", Value = "#f0f" });
76+
db.Insert(new ColorModel { Color = "yellow", Value = "#ff0" });
77+
db.Insert(new ColorModel { Color = "black", Value = "#000" });
78+
79+
// SQL contains array and json aggs.
80+
// We usually have ARRAY fields defined in the db, but when
81+
// retrieved we json-ize them. In otherwords the array exists in the tables/views.
82+
// We use SELECT.* which would contain the ARRAY field.
83+
// Array fields are not used in any of our models and should not cause the other
84+
// fields in the model to not be populated.
85+
const string sql = @"SELECT 1::integer AS id
86+
, json_agg(color.*) AS color_json
87+
, array_agg(color.*) AS color_array
88+
FROM color;";
89+
90+
var results = db.Select<ColorJsonModel>(sql);
91+
92+
Assert.That(results.Count, Is.EqualTo(1));
93+
94+
foreach (var result in results)
95+
{
96+
result.ColorJson.Print();
97+
Assert.That(result.Id, Is.EqualTo(1));
98+
Assert.That(result.ColorJson, Is.Not.Null);
99+
}
100+
}
101+
}
102+
}
103+
104+
}

src/ServiceStack.OrmLite/OrmLiteWriteCommandExtensions.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,14 @@ public static T PopulateWithSqlReader<T>(this T objWithProperties,
294294
if (values == null)
295295
values = new object[reader.FieldCount];
296296

297-
dialectProvider.GetValues(reader, values);
297+
try
298+
{
299+
dialectProvider.GetValues(reader, values);
300+
}
301+
catch (Exception ex)
302+
{
303+
Log.Warn("Error trying to use GetValues() from DataReader. Falling back to individual field reads...", ex);
304+
}
298305
}
299306
else
300307
{

0 commit comments

Comments
 (0)