当前位置: 首页 > 知识库问答 >
问题:

C#-“DateTime.UtcNow”以被视为超出Postgres DB范围的格式输出日期

狄易安
2023-03-14

我换了一台新的笔记本电脑(Windows10i5),并试图设置我的笔记本电脑。NET应用程序。我遇到了一个奇怪的问题,花了我很多时间。在我的应用程序中,我将当前日期时间以UTC格式存储在Postgres DB表中。c#命令DateTime。UtcNow将日期格式输出为

14-12-2021 13:50:57

当上述日期通过要存储在Postgres Db中的insert查询传递时,它抛出错误如下

错误:日期/时间字段值超出范围:"14-12-2021 13:50:57"

更奇怪的是,在我的旧笔记本电脑上(同样的操作系统-视窗10 i3),同样的代码工作正常,并给出日期的输出

12/14/2021 07:24:24上午

这种格式被Postgres DB接受。

表的设计如下所示

CREATE TABLE IF NOT EXISTS public."Log"
(
    "Id" bigint NOT NULL DEFAULT nextval('"Log_Id_seq"'::regclass),
    "QueueId" uuid NOT NULL,
    "MessageId" character varying(100) COLLATE pg_catalog."default",
    "LogTime" timestamp without time zone,   
   
    CONSTRAINT "Log_pkey" PRIMARY KEY ("Id")
)

日期时间生成的值。UtcNow正在传递到LogTime列中。

下面是构成Postgres查询的c#代码。

string query = $@"INSERT INTO public.""Log""(
                            ""QueueId"", 
                            ""LogTime"", 
                            ""Message"", 
                            )
                            VALUES(
                            '{req.QueueId}', 
                            '{req.LogTime}', 
                            '{(item.Message.Length > 100 ? item.Message.Substring(0, 100) : item.Message)}'                           
                            RETURNING ""Id"";";

相同的代码在具有相同操作系统的不同机器上的行为不同。任何线索都将不胜感激。谢谢你的帮助。

共有2个答案

鲁旭
2023-03-14

设置日期样式以匹配您的输入。这个对我很有用:

SET DateStyle to DMY;
SELECT '14-12-2021 13:50:57'::TIMESTAMP
皇甫俊雅
2023-03-14

我重复上面的评论,因为您在编写{req.LogTime}时正在转换字符串中的日期时间,因此代码为数据库创建了一个解析问题,因为它需要将该字符串转换回timespan以将其插入列中。这不仅在转换字符串时容易产生不同的结果(一台电脑认为日期的正确格式是“MM-dd”,另一台电脑认为是“dd-MM”),而且还造成了一个众所周知的漏洞,称为Sql注入
只需使用参数将值传递给数据库即可
使用适当的类型定义参数,值的解析不再有歧义,数据库也不会受到脚本孩子尝试世界上最简单的黑客攻击的影响。

string query = $@"INSERT INTO public.""Log""(
                  ""QueueId"", LogTime"", ""Message"")
                  VALUES(@qid, @ltime, @msg)                           
                  RETURNING ""Id"";";

using (var cmd = new NpgsqlCommand(query, conn))
{
    cmd.Parameters.Add("@qid", NpgsqlDbType.Uuid).Value = req.QueueId;
    cmd.Parameters.Add("@ltime", NpgsqlDbType.Timestamp).Value = req.LogTime;
    cmd.Parameters.Add("@msg", NpgsqlDbType.Varchar).Value = 
         (item.Message.Length > 100 ? item.Message.Substring(0, 100) : item.Message);
   var id = cmd.ExecuteScalar();
}
 类似资料:
  • 假设我有一个这样的数组: 我故意用从负值到高于9的任何值对它进行索引,但不使用任何方式产生的值。这是出于性能原因(也许在数组访问完成后检查输入索引更有效)。 我的问题是: 这样做安全吗,或者我会遇到某种内存保护障碍,有可能破坏内存或某些索引的类似功能吗

  • 我正在移动一个ASP经典应用程序到一个新的服务器。我没有开发的应用程序和我没有经验与ASP希望有人能指导我。 我读到可能是日期格式,所以我把它改成YYYY-MM-DD。 现在它正显示出这一点: 数据库上的日期格式如下所示: 这是asp文件的代码:

  • 问题内容: 为什么使用lambda函数来获取值列表i = 4。在调用lambda期间,不存在封闭范围。函数f已经完成工作并返回了控制(变量i不存在)。 问题答案: Python使用闭包捕获对原始变量的引用。这些对象保留对名称的引用,可以通过该引用访问值。这意味着变量在完成后将继续存在。 您可以在lambda对象的元组中内省此闭包;函数具有相同的属性: 这也是列表中 所有 lambda 都引用val

  • 问题内容: 我有以下代码: 我的索引超出范围错误,我不知道为什么。我声明了大小为10的尺寸。为什么会出现此错误? 问题答案: 您声明了一个,其初始容量为10个元素,但没有向此列表中添加元素,即列表为空。将替换现有元素,但是由于列表中没有元素,因此将引发异常。您必须使用方法在之前添加元素。 表示列表内部维护的数组的开头大小为10。在列表中添加更多元素时,此内部数组的大小可能会更改。

  • 问题内容: 我收到错误 BIGINT UNSIGNED值超出范围在’(1301980250 - 。。 )’ 当我运行查询 删除ORDER BY条件,也将删除错误。我该如何解决? 更新: 日期字段包含UNIX时间戳(例如:1298944082)。我将MySQL从5.0.x升级到5.5.x后开始出现错误 有什么帮助吗? 问题答案: 我最近遇到了这个问题,并找到了最合理的解决方案,可以将任何UNSIGN

  • 主要内容:Log4j Layout类型,Log4j Layout方法Apache Log4j 支持各种Layout对象,每个对象都可以根据各种布局格式化日志数据。我们还可以创建一个 Layout 对象,以特定于应用程序的方式格式化日志数据。 所有 Layout 对象都从Appender对象接收一个LoggingEvent对象。然后 Layout 对象从 LoggingEvent 中检索消息参数并应用适当的 ObjectRenderer 来获取消息的字符串表示。 L