Using Oracle as a backend causes exceptions with certain utilities with dynamic results or results to a dictionary. If we use POCO classes things work. However, we have a need for adhoc queries which require an unknown result structure.
For example. We have an Oracle table which uses oracle types number(*) and Date. Using DumpTable we get an exception in ServiceStack.Script.DefaultScripts.dateFormat(DateTime dateValue). The value is nullable in the table. When using PrintDump we see
CMP_AUTO_KEY:
{
__type: “ServiceStack.OrmLite.Oracle.OracleValue, ServiceStack.OrmLite.Oracle”
},
for those two oracle data types. Finally, using ToCsv on the results all of those columns are shown as {} in the result set.
You can try registering an Auto mapping Converter that converts it to a DateTime if that’s the cause of the Exception it’s trying to coerce to.
Otherwise you’d need to pass it through your own santize script method which modifies a Dictionary<string,object> to replace all non serializable values to their system types.
So looked into the script stuff… bit much to try and wrap my head around. I was able to make a simple converter that meets my needs. Seems to work fine. This was a unit test.
AutoMapping.RegisterConverter((Dictionary<string, object> d) =>
{
var nd = new Dictionary<string, object>();
d.ForEach((s, o) =>
{
nd[s] = o?.ToString();
});
return nd;
}
);
var dbFactory = ServiceProvider.GetRequiredService<IDbConnectionFactory>();
using var db = dbFactory.Open();
var result = await db.SelectAsync<Dictionary<string, object>>("Select * from companies");
var e = result.ConvertAll(input => input.ConvertTo<Dictionary<string, object>>());
var t = e.DumpTable();