2017-05-20 248 views
1

我正在使用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> 

記錄正常,當我使用v2.2.7 Npgsql的NuGet包。

但當升級NuGet包到Npgsql v3.2.2和EntityFramework6.Npgsql到V3.1.1日誌,並對錯誤:

protected static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); 
Logger.Info("Logger started."); 

以下錯誤:

42804: column "ENTRY_DATE" is of type timestamp without time zone but expression is of type text

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: Npgsql.PostgresException: 42804: column "ENTRY_DATE" is of type timestamp without time zone but expression is of type text

[PostgresException (0x80004005): 42804: column "ENTRY_DATE" is of type timestamp without time zone but expression is of type text]

網絡配置的變化

爲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> 

爲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的數據庫列的定義:

"ENTRY_DATE" timestamp without time zone 

當升級到V3.0的哪些變化?請幫助在v3.x上使用正確的方法。

在此先感謝。

+0

李善雄列定義: 「ENTRY_DATE」 時間戳沒有時區 – Fatih

+0

FYI ,來自NLog數據庫目標的所有數據庫參數都是文本類型。也許你需要在查詢中解析。 – Julian

+0

@Julian謝謝你的回覆。考慮到「NLog數據庫目標是文本類型」,可能我需要編寫自定義記錄器類。但是我想知道是否有一種方法在遷移到Npgsql新的3.x版本時沒有代碼更改需要,而Nlog 4.x正確地使用Npgsql 2.2.7。 – Fatih

回答

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

+0

謝謝@朱連。轉換函數適用於SQL語句。 – Fatih

相關問題