我使用NLog4.1版本进行日志记录。
我的“NLog.config”看起来像:
<target name="database" xsi:type="Database">
<connectionStringName>PRODUCTION</connectionStringName>
<commandText>
INSERT INTO "MY"."LOG_TABLE" ( "ENTRY_DATE" ) VALUES ( @ENTRY_DATE );
</commandText>
<parameter name="@entry_date" layout="${longdate}"/>
</target>
当我使用Npgsql v2.2.7 Nuget包时,记录正常。
但是当Nuget包升级到Npgsql v3.2.2而EntityFramework6.Npgsql升级到v3.1.1时会出现错误:
protected static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
Logger.Info("Logger started.");
以下错误:
42804:“ENTRY_DATE”列的时间戳类型没有时区但表达式的类型为text
描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:Npgsql.PostgresException:42804:列“ENTRY_DATE”的类型为timestamp,没有时区但表达式的类型为text
[PostgresException(0x80004005):42804:“ENTRY_DATE”列的类型为timestamp,没有时区但表达式的类型为text]
网络配置更改
for v2.2.7:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework" />
</providers>
</entityFramework>
for v3.2.2:
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
</providers>
</entityFramework>
Postgresql DB列定义:
"ENTRY_DATE" timestamp without time zone
升级到v3.x后有什么变化?请帮助在v3.x上正确使用。
提前致谢。
答案 0 :(得分:0)
NLog中数据库目标的参数是文本参数。
似乎Npgsql / PostgreSQL / EntityFramework6现在更加挑剔。
您需要将string
转换为timestamp
类型。您可以使用to_timestamp
PostgreSQL函数在查询中执行此操作:
<commandText>
INSERT INTO "MY"."LOG_TABLE" ( "ENTRY_DATE" )
VALUES (to_timestamp(@ENTRY_DATE, 'YYYY-MM-DD H24:MI:SS.MS');
</commandText>
C#中的格式:yyyy-MM-dd HH:mm:ss.ffff
,在PostgreSQL中:YYYY-MM-DD H24:MI:SS.MS
- 请参阅PostgreSQL docs