NLog, Npgsql.PostgresException: '42804: 列 "DateTime" 是没有时区的时间戳类型,但表达式是文本类型
NLog, Npgsql.PostgresException: '42804: column "DateTime" is of type timestamp without time zone but expression is of type text
我使用 NLog 登录到 PostrgeSQL 数据库。
我创建了 table:
CREATE TABLE "Data"."Logs"
(
"ID" serial primary key,
"Level" character varying(20),
"DateTime" timestamp,
"Message" character varying,
"Exception" character varying
)
然后我配置目标:
var logDB = new DatabaseTarget()
{
Name = "logDB",
DBProvider = "Npgsql.NpgsqlConnection,Npgsql",
ConnectionString = connectionString,
KeepConnection = true,
CommandText = $@"INSERT INTO ""{SchemaName}"".""{FileManagerLogsTableName}""(""{Level}"", ""{DateTime}"", ""{Message}"", ""{Exception}"") VALUES (@level, @datetime, @message, @exception)"
};
logDB.Parameters.Add(new DatabaseParameterInfo("@level", "${level}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@datetime", "${date:format=yyyy-MM-dd hh:mm:ss}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@message", "${message}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@exception", "${exception:format=shortType,message :separator= - }${newline}${exception:format=method}${newline}${exception:format=stackTrace:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}"));
config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Info, logDB));
LogManager.Configuration = config;
LogManager.ThrowExceptions = Debugger.IsAttached;
但是当我想登录时:
logger.Error(ex, ex.Message);
它抛出异常:
Npgsql.PostgresException: '42804: column "DateTime" is of type timestamp without time zone but expression is of type text
这是非常简单的解决方案。只需将 DateTime 转换为 CommandText 中的时间戳:
CommandText = $@"INSERT INTO ""{SchemaName}"".""{FileManagerLogsTableName}""(""{Level}"", ""{DateTime}"", ""{Message}"", ""{Exception}"") VALUES (@level, CAST(@datetime AS timestamp), @message, @exception)"
我使用 NLog 登录到 PostrgeSQL 数据库。
我创建了 table:
CREATE TABLE "Data"."Logs"
(
"ID" serial primary key,
"Level" character varying(20),
"DateTime" timestamp,
"Message" character varying,
"Exception" character varying
)
然后我配置目标:
var logDB = new DatabaseTarget()
{
Name = "logDB",
DBProvider = "Npgsql.NpgsqlConnection,Npgsql",
ConnectionString = connectionString,
KeepConnection = true,
CommandText = $@"INSERT INTO ""{SchemaName}"".""{FileManagerLogsTableName}""(""{Level}"", ""{DateTime}"", ""{Message}"", ""{Exception}"") VALUES (@level, @datetime, @message, @exception)"
};
logDB.Parameters.Add(new DatabaseParameterInfo("@level", "${level}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@datetime", "${date:format=yyyy-MM-dd hh:mm:ss}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@message", "${message}"));
logDB.Parameters.Add(new DatabaseParameterInfo("@exception", "${exception:format=shortType,message :separator= - }${newline}${exception:format=method}${newline}${exception:format=stackTrace:maxInnerExceptionLevel=5:innerFormat=shortType,message,method}"));
config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Info, logDB));
LogManager.Configuration = config;
LogManager.ThrowExceptions = Debugger.IsAttached;
但是当我想登录时:
logger.Error(ex, ex.Message);
它抛出异常:
Npgsql.PostgresException: '42804: column "DateTime" is of type timestamp without time zone but expression is of type text
这是非常简单的解决方案。只需将 DateTime 转换为 CommandText 中的时间戳:
CommandText = $@"INSERT INTO ""{SchemaName}"".""{FileManagerLogsTableName}""(""{Level}"", ""{DateTime}"", ""{Message}"", ""{Exception}"") VALUES (@level, CAST(@datetime AS timestamp), @message, @exception)"