我已轉移到一臺新筆記本電腦(Windows 10 i5)并嘗試設定我的 .NET 應用程式。我遇到了一個奇怪的問題,它占用了我很多時間。在我的應用程式中,我將當前日期時間以 UTC 格式存盤在 Postgres 資料庫表中。c# 命令DateTime.UtcNow將日期格式輸出為
14-12-2021 13:50:57
當通過插入查詢傳遞上述日期以存盤在 Postgres Db 中時,它會拋出錯誤為
錯誤:日期/時間欄位值超出范圍:“14-12-2021 13:50:57”
更奇怪的是,在我的舊筆記本電腦(相同的作業系統 - Windows 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")
)
產生的值DateTime.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"";";
相同的代碼在具有相同作業系統的不同機器上表現不同。任何線索將不勝感激。謝謝你的幫助。
uj5u.com熱心網友回復:
我重復上面的評論,因為您在撰寫“{req.LogTime}”時正在轉換字串中的日期時間,并且代碼會為您的資料庫創建決議問題,因為它需要將該字串轉換回時間跨度以插入它在列中。這不僅在轉換字串時容易出現不同的結果(一臺電腦認為日期的正確格式是“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();
}
uj5u.com熱心網友回復:
設定日期樣式以匹配您的輸入。這個對我有用:
SET DateStyle to DMY;
SELECT '14-12-2021 13:50:57'::TIMESTAMP
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380938.html
