如何在 c# 中的 postgres db 中设置日期样式
How to set datestyle in postgres db in c#
我想在 postgres sql 数据库中将日期类型更改为 "DMY" 格式。我使用 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';
如何在 C# 中使用 Npgsql 实现此目的?
SQL 为我的table
创建语句
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 的访问是这样的,字符串 sqlCmd 中给出的 INSERT 语句如下:
INSERT INTO t_plate_history(plate,timestamp,direction,position) VALUES(1359,'09.02.2018 15:02:08' ,true,705)
最后是我与 Npg 进行交易的代码sql:
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;
}
如果您有权访问服务器,则可以在 postgresql.conf 中对其进行配置。
否则尝试按照 documentation.
中所述在服务器或客户端上设置 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 对象,提供商会处理其余部分。查看 documentation
你在做什么仍然不清楚 - 你的问题中有多个代码片段,并且不清楚它们是如何相互作用的。请考虑发布一个仅包含重现问题的必要代码的最小函数。
然而,从第一个片段看来,您正在打开 NpgsqlConnection,设置 DateStyle
参数,然后放弃该连接(函数退出)。在连接中设置 DateStyle
只会更改该连接 的设置 ,而不会更改其他连接。此外,连接关闭的那一刻(即返回到连接池),其状态将被重置并且 DateStyle
更改将被撤消。
如果您尝试更改所有数据库连接的 DateStyle
,您可以按照@devdimi 的建议在 postgresql.conf 中或通过 PGDATESTYLE 环境变量设置参数。或者每次打开连接后都要注意设置参数。
请注意,如果您在打开连接后没有关闭或释放连接(就像您在第一个代码示例中所做的那样),那么您就是在泄漏连接。您必须始终关闭连接,可能通过 C# using 语句。
我想在 postgres sql 数据库中将日期类型更改为 "DMY" 格式。我使用 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';
如何在 C# 中使用 Npgsql 实现此目的?
SQL 为我的table
创建语句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 的访问是这样的,字符串 sqlCmd 中给出的 INSERT 语句如下:
INSERT INTO t_plate_history(plate,timestamp,direction,position) VALUES(1359,'09.02.2018 15:02:08' ,true,705)
最后是我与 Npg 进行交易的代码sql:
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;
}
如果您有权访问服务器,则可以在 postgresql.conf 中对其进行配置。
否则尝试按照 documentation.
中所述在服务器或客户端上设置 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 对象,提供商会处理其余部分。查看 documentation
你在做什么仍然不清楚 - 你的问题中有多个代码片段,并且不清楚它们是如何相互作用的。请考虑发布一个仅包含重现问题的必要代码的最小函数。
然而,从第一个片段看来,您正在打开 NpgsqlConnection,设置 DateStyle
参数,然后放弃该连接(函数退出)。在连接中设置 DateStyle
只会更改该连接 的设置 ,而不会更改其他连接。此外,连接关闭的那一刻(即返回到连接池),其状态将被重置并且 DateStyle
更改将被撤消。
如果您尝试更改所有数据库连接的 DateStyle
,您可以按照@devdimi 的建议在 postgresql.conf 中或通过 PGDATESTYLE 环境变量设置参数。或者每次打开连接后都要注意设置参数。
请注意,如果您在打开连接后没有关闭或释放连接(就像您在第一个代码示例中所做的那样),那么您就是在泄漏连接。您必须始终关闭连接,可能通过 C# using 语句。