diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fd45508..1bcf955e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +- Fixed YdbDataReader: extract Json / Yson types + ## v0.7.2 - Fixed YdbDataReader: `GetValue()` returns `DbNull.Value` if field is null - YdbOperationInProgressException extends YdbException diff --git a/src/Ydb.Sdk/src/Ado/YdbDataReader.cs b/src/Ydb.Sdk/src/Ado/YdbDataReader.cs index b7a963e6..c132cb9d 100644 --- a/src/Ydb.Sdk/src/Ado/YdbDataReader.cs +++ b/src/Ydb.Sdk/src/Ado/YdbDataReader.cs @@ -333,7 +333,10 @@ public override object GetValue(int ordinal) YdbTypeId.Float => ydbValue.GetFloat(), YdbTypeId.Double => ydbValue.GetDouble(), YdbTypeId.Interval => ydbValue.GetInterval(), - YdbTypeId.Utf8 or YdbTypeId.JsonDocument or YdbTypeId.Json or YdbTypeId.Yson => GetString(ordinal), + YdbTypeId.Utf8 => ydbValue.GetUtf8(), + YdbTypeId.Json => ydbValue.GetJson(), + YdbTypeId.JsonDocument => ydbValue.GetJsonDocument(), + YdbTypeId.Yson => ydbValue.GetYson(), YdbTypeId.String => ydbValue.GetString(), YdbTypeId.DecimalType => ydbValue.GetDecimal(), _ => throw new YdbException($"Unsupported ydb type {ydbValue.TypeId}") diff --git a/src/Ydb.Sdk/tests/Ado/YdbCommandTests.cs b/src/Ydb.Sdk/tests/Ado/YdbCommandTests.cs index 6cd22f4a..951d9440 100644 --- a/src/Ydb.Sdk/tests/Ado/YdbCommandTests.cs +++ b/src/Ydb.Sdk/tests/Ado/YdbCommandTests.cs @@ -2,6 +2,7 @@ using System.Text; using Xunit; using Ydb.Sdk.Ado; +using Ydb.Sdk.Value; namespace Ydb.Sdk.Tests.Ado; @@ -67,6 +68,42 @@ public async Task ExecuteScalarAsync_WhenSetYdbParameterThenPrepare_ReturnThisVa Assert.Equal(data.Expected, await dbCommand.ExecuteScalarAsync()); } + [Fact] + public async Task ExecuteScalarAsync_WhenNoDbTypeParameter_ReturnThisValue() + { + const string simpleJson = @"{""a"":""b""}"; + + var args = new List<(YdbValue YdbValue, object Expected)> + { + (YdbValue.MakeJson(simpleJson), simpleJson), + (YdbValue.MakeJsonDocument(simpleJson), simpleJson), + (YdbValue.MakeInterval(TimeSpan.FromSeconds(5)), TimeSpan.FromSeconds(5)), + (YdbValue.MakeYson(Encoding.ASCII.GetBytes("{type=\"yson\"}")), Encoding.ASCII.GetBytes("{type=\"yson\"}")), + (YdbValue.MakeOptionalJson(simpleJson), simpleJson), + (YdbValue.MakeOptionalJsonDocument(simpleJson), simpleJson), + (YdbValue.MakeOptionalInterval(TimeSpan.FromSeconds(5)), TimeSpan.FromSeconds(5)), + (YdbValue.MakeOptionalYson(Encoding.ASCII.GetBytes("{type=\"yson\"}")), + Encoding.ASCII.GetBytes("{type=\"yson\"}")) + }; + + await using var connection = new YdbConnection(); + await connection.OpenAsync(); + + var dbCommand = connection.CreateCommand(); + dbCommand.CommandText = "SELECT @var;"; + + foreach (var arg in args) + { + dbCommand.Parameters.Clear(); + dbCommand.Parameters.Add(new YdbParameter + { + ParameterName = "@var", + Value = arg.YdbValue + }); + Assert.Equal(arg.Expected, await dbCommand.ExecuteScalarAsync()); + } + } + [Fact] public async Task ExecuteNonQueryAsync_WhenCreateUser_ReturnEmptyResultSet() {