Как установить datestyle в Postgres DB в C # - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу изменить тип даты на th-формат "DMY" в базе данных postgres sql. Я использую библиотеку Npgsql следующим образом:

    public void SetDateSytleDB()
    {
        string sqlConnectionString = "Server=localhost;Port=5432;User Id=test;Password=test;Database=test_db";

        sqlCnctn = new NpgsqlConnection(sqlConnectionString);
        sqlCnctn.Open();
        if (sqlCnctn.State == ConnectionState.Open)
        {
            String strSetDatestyle = "SET datestyle = 'ISO, DMY'";

            using (var cmd = new NpgsqlCommand(strSetDatestyle, sqlCnctn))
            {
                cmd.ExecuteNonQuery();
            }
        }
    }

к сожалению, тип даты не будет изменен в базе данных впоследствии. Когда я вызываю show datestyle, значение остается в «MDY». В PgAdmin это работает так:

SET datestyle = 'ISO, DMY';

Как мне добиться этого с помощью Npgsql в C #?

SQL Создать операторы для моей таблицы

CREATE TABLE public.t_plate_history (
id integer NOT NULL,
plate integer NOT NULL,
"timestamp" timestamp with time zone NOT NULL,
direction boolean NOT NULL,
"position" integer NOT NULL
);

Метка времени создается в отсортированном списке с помощью команды DateTime.Now.

SortedList<string, object> values = new SortedList<string, object>
                                    {
                                      {TblPlateHistory.FieldDirection, insert},
                                      {TblPlateHistory.FieldPlate, LocalDataSet.Plate.Id},
                                      {TblPlateHistory.FieldPosition, LocalDataSet.PlatePosition.Id},
                                      {TblPlateHistory.FieldTimestamp, DateTime.Now}
                                    };


{TblPlateHistory.FieldTimestamp, DateTime.Now}

Тогда доступ через Npgsql выглядит следующим образом, оператор INSERT, заданный в строке sqlCmd, выглядит следующим образом:

 INSERT INTO t_plate_history(plate,timestamp,direction,position) VALUES(1359,'09.02.2018 15:02:08' ,true,705)

И наконец код, где я делаю транзакцию с Npgsql:

public bool RunNonQueryCommand(string sqlCmd, NpgsqlTransaction transAction, NpgsqlConnection connection)
{
    NpgsqlCommand sqlCom = new NpgsqlCommand(sqlCmd, connection);
    bool rt = true;
    try
    {               
        sqlCom.Transaction = transAction;
        sqlCom.ExecuteNonQuery();
    }

    ...

    return rt;


}

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Что вы делаете до сих пор не ясно - в вашем вопросе несколько фрагментов кода, и неясно, как они взаимодействуют.Пожалуйста, рассмотрите возможность размещения единственной минимальной функции, содержащей только необходимый код, воспроизводящий вашу проблему.

Тем не менее, из первого фрагмента кажется, что вы открываете NpgsqlConnection, устанавливаете параметр DateStyle и затем прекращаете это соединение (функция выходит).Установка DateStyle в соединении изменит только настройку для этого соединения , но не для других соединений.Кроме того, в тот момент, когда соединение закрывается (т.е. возвращается в пул соединений), его состояние будет сброшено, и изменение DateStyle будет отменено.

Если вы пытаетесь изменить DateStyleдля всех соединений с базой данных вы можете следовать предложению @ devdimi для установки параметра в postgresql.conf или через переменную окружения PGDATESTYLE.Или вы должны позаботиться об установке параметра каждый раз после открытия соединения.

Обратите внимание, что если вы не закрыли или не удалили соединение после его открытия, как вы это делали в первом примере кода, выпротекающие соединения.Вы всегда должны закрывать соединения, возможно, через оператор C # using.

0 голосов
/ 15 ноября 2018

Если у вас есть доступ к серверу, вы можете настроить его в postgresql.conf.

В противном случае попробуйте установить переменную среды PGDATESTYLE на сервере или клиенте, как указано в документации .

Ваш способ настройки может работать только для текущей транзакции. Вы можете попытаться повторно использовать одно и то же открытое соединение и проверить, действует ли оно.

Реальный вопрос в том, почему вы хотите изменить эту настройку? Вместо этого вы можете использовать оператор вставки, подобный этому:

INSERT INTO t_plate_history(id, plate,timestamp,direction,position) 
VALUES(1, 1359, timestamp '2018-02-09 15:02:08' ,true,705)

Чтобы получить этот формат даты, вы можете использовать:

DateTime dateTime = new DateTime(2018, 2, 9, 15, 2, 8); // get you datetime object
dateTime.ToString("yyyy-MM-dd HH:mm:ss")

Еще лучше было бы использовать подготовленные операторы, в которых вы устанавливаете только объект DateTime, а остальное заботится поставщик. Ознакомьтесь с документацией

...