My question relates to the post https://forum.vertica.com/discussion/242318/net-5-ado-net-client-wrong-result-for-coalesce/p1?new=1
How can I pass correctly Time value to the query?
I tried:
[Test]
public async Task TestDirectlyFromConnectionTimeAsTimeSpan()
{
await using var connection = VerticaHelper.OpenLocalVerticaDatabaseConnection();
await using var command = connection.CreateCommand();
command.CommandText = $"SELECT COALESCE(@a, @b) AS \"exp\"";
command.Parameters.Add(new VerticaParameter("a", VerticaType.Time, new TimeSpan(0, 13,53,54, 814255)));
command.Parameters.Add(new VerticaParameter("b", VerticaType.Time, new TimeSpan(0, 13, 51, 54, 814255)));
DbDataReader reader = await command.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
var value = reader.GetValue(0);
value.Should().Be(new TimeSpan(0, 13, 53, 54, 814255));
}
}
For this case I receive the following exception:
System.IndexOutOfRangeException : Index was outside the bounds of the array.
at Vertica.Data.Internal.ADO.Net.TimeSpanConverter.FromTimeSpan(TimeSpan sourceData, TypeMetadata targetMetadata)
at Vertica.Data.Internal.ADO.Net.SCommand.GetExecutionContextInputs(IList1 targetMetadataList, SParameterCollection paramCollection, IDictionary2 metadataToParam)
at Vertica.Data.Internal.ADO.Net.SCommand.ExecuteReader(CommandBehavior behavior)
at Vertica.Data.Internal.ADO.Net.SCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
[Test]
public async Task TestDirectlyFromConnectionTimeAsString()
{
await using var connection = VerticaHelper.OpenLocalVerticaDatabaseConnection();
await using var command = connection.CreateCommand();
command.CommandText = $"SELECT COALESCE(@a::time(6), @b::time(6)) AS \"exp\"";
command.Parameters.Add(new VerticaParameter("a", VerticaType.Time, "13:53:54.814255"));
command.Parameters.Add(new VerticaParameter("b", VerticaType.Time, "13:51:54.814255"));
DbDataReader reader = await command.ExecuteReaderAsync();
// GENERATED QUERY: SELECT COALESCE('13:53:54.814255'::time(6), '13:51:54.814255'::time(6)) AS "exp";
while (await reader.ReadAsync())
{
//Returns datetime {01.01.0001 13:53:54}
var value = reader.GetValue(0);
value.Should().Be(new TimeSpan(0, 13, 53, 54, 814255));
}
}
For this one - the returned value is DateTime, and additionally is trimmed.
kind regards,
Kamil
