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,设置
如果您尝试更改与数据库的所有连接的
请注意,如果在打开连接后没有关闭或处置连接,就像在第一个代码示例中所做的那样,则可能是在泄漏连接。您必须始终关闭连接,可能通过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对象,提供者负责其余的工作。查看文档