Временная метка с C#, Dapper, Npgsql и jsonC#

Место общения программистов C#
Ответить
Anonymous
 Временная метка с C#, Dapper, Npgsql и json

Сообщение Anonymous »

У меня есть функция, возвращающая json, содержащая метку времени. Когда я выполняю его в pgAdmin, я получаю json типа

Код: Выделить всё

{..., "time_created":"2024-05-15T11:14:23.384266+00:00",...}.
Но когда я выполняю ту же функцию на C# с помощью ExecuteScalar, возвращаемое значение похоже на

Код: Выделить всё

{..., "time_created":"2024-05-15T09:14:23.384266+02:00",...}
Она ведет себя одинаково, даже если функция возвращает json, преобразованный в текст заранее. Обратите внимание, что временные метки преобразуются в часовой пояс сервера и смещение времени сервера, если оно добавлено. Это невозможно отобразить в элементах управления Quasar без изменений.
Что заставляет ExecuteScalar выполнять преобразование, даже если из функции возвращается текст?Если функция возвращает таблицу, содержащую метку времени, значения возвращаются правильно, а сериализация создает значения в форме, например: "time_created":"2024-05-15T11:14:23.384266Z", который можно нормально отобразить при вводе Quasar.
Есть ли способ заставить все, что конвертирует json, строки при чтении с помощью ExecuteScalar, чтобы сделать это с помощью ...Z?
Функция

Код: Выделить всё

create function data_survey_r("Key" integer) returns text language plpgsql as $$
BEGIN
RETURN (SELECT ROW_TO_JSON(t)::text FROM data.survey t WHERE t.id = "Key");
END $$;
или

Код: Выделить всё

create function data_survey_r("Key" integer) returns json language plpgsql as $$
BEGIN
RETURN (SELECT ROW_TO_JSON(t) FROM data.survey t WHERE t.id = "Key");
END $$;
Он вызывается из C# как

Код: Выделить всё

ret = (string) await connection.ExecuteScalarAsync("data_survey_r", new { Key = key }, commandType: CommandType.StoredProcedure);
РЕДАКТИРОВАТЬ: (Текст из этого комментария):

Код: Выделить всё

create function test_now () returns json as $$
BEGIN
return (SELECT json_build_object('now', now()));
END $$
language plpgsql
C#

Код: Выделить всё

NpgsqlConnection con = new NpgsqlConnection(_options.ConnectionString);
con.Open();
var ret = await con.ExecuteScalarAsync("test_now");
Результат: {"сейчас" : "2024-06-22T12:53:30.515689+00:00"
в консоль, {"сейчас" : "2024-06-22T14:53:40.079963+02:00"

Подробнее здесь: https://stackoverflow.com/questions/786 ... l-and-json
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»