关于Postgresql:如何在C#中的postgres db中设置datestyle

How to set datestyle in postgres db in c#

我想在postgres sql数据库中将日期类型更改为" DMY"格式。 我使用Npgsql库,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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';

如何在C#中使用Npgsql实现此目的?

我的表的SQL创建语句

1
2
3
4
5
6
7
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命令在排序列表中创建时间戳。

1
2
3
4
5
6
7
8
9
10
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的访问如下所示,字符串sqlCmd中给出的INSERT语句如下:

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

最后是我使用Npgsql进行交易的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;


}


您仍在做什么尚不清楚-您的问题中有多个代码片段,也不清楚它们是如何交互的。请考虑发布仅包含必要代码的单个最小功能,以重现您的问题。

但是,从第一个片段看,您似乎正在打开NpgsqlConnection,设置DateStyle参数,然后放弃该连接(函数退出)。在连接中设置DateStyle仅会更改该连接的设置,而不会更改其他连接。另外,在关闭连接(即返回到连接池)的那一刻,其状态将被重置,DateStyle更改将被撤消。

如果您尝试更改与数据库的所有连接的DateStyle,则可以按照@devdimi的建议在postgresql.conf中或通过PGDATESTYLE环境变量设置参数。否则,每次打开连接后,您都必须小心设置参数。

请注意,如果在打开连接后没有关闭或处置连接,就像在第一个代码示例中所做的那样,则可能是在泄漏连接。您必须始终关闭连接,可能通过C#using语句关闭连接。


如果您有权访问服务器,则可以在postgresql.conf中对其进行配置。

否则,请尝试按照文档中所述在服务器或客户端上设置PGDATESTYLE环境变量。

您的设置方式可能仅适用于当前交易。
您可以尝试重用同一打开的连接,并检查其是否有效。

真正的问题是为什么要更改此设置?
相反,您可以使用如下插入语句:

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

要获取此日期格式,可以使用:

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

更好的方法是使用准备好的语句,在该语句中,您仅设置DateTime对象,提供者负责其余的工作。查看文档