输入日期时间访问数据库

时间:2016-09-05 00:37:43

标签: c# ms-access ado.net log4net log4net-appender

我今天开始使用log4net。它开始非常好,我为我的应用程序得到了我的第一个基于文本的日志文件。然后我采取了下一步并尝试登录表t_log_dat中的Accessdatabase log_db.accdb。这首先是goot,我能够记录类型字符串和int32的数据。当我试图将时间戳包含为Datetime时,问题就开始了。这是我的appender的基础设置和我迄今为止尝试的@log_date参数

<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
  <connectionString value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=log_db.accdb" />
  <commandText value="INSERT INTO t_log_dat ([dt_timestanp],[str_message],[int_thread]) VALUES (@log_date,@message, @thread)" />

首先尝试:如MS-Access文档中所述。 https://logging.apache.org/log4net/release/config-examples.html

<parameter>
    <parameterName value="@log_date" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date" />
    </layout>
</parameter>

第二次尝试:操纵字符串,因此它遵循插入到ms访问的规范。像这样的事情&#39; 2015-08-09 09:23:00&#39;

<parameter>
    <parameterName value="@log_date"/>
    <dbType value="String"/>
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="'%date{yyyy'-'MM'-'dd HH':'mm':'ss}'" />
    </layout>
</parameter>

我最后一次尝试是使用基本的log4net RawTimestampLayout

<parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>

但是,以上都没有为我工作。构建应用程序时,我总是遇到以下错误

  

log4net:错误[AdoNetAppender] ErrorCode:GenericFailure。写入数据库System.Data.OleDb.OleDbException时发生异常   (0x80040E07):在Kriterienausdruck中的Datentypenkonflikt。北   System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult   小时)

编辑 - 错误转换为

  

数据类型不匹配

有谁知道如何使用log4net在访问数据库中输入时间戳?

P.S。:这个问题与Configuring log4net to write on a database不同,因为我特意试图弄清楚如何使用log4net将datetime-value写入访问数据库。上面提到的Thread只是要求使用log4net写入数据库的一般帮助。此外,提供的答案仅显示如何激活log4net的跟踪,我已经在此问题中包含了该跟踪。

1 个答案:

答案 0 :(得分:0)

我从https://github.com/apache/log4net获得了来源,我不认为可以在访问atm中插入DateTime。 问题是AdoNetAppender.cs中的函数准备:

        virtual public void Prepare(IDbCommand command)
    {
        // Create a new parameter
        IDbDataParameter param = command.CreateParameter();

        // Set the parameter properties
        param.ParameterName = ParameterName;

        if (!m_inferType)
        {
            param.DbType = DbType;
        }
        if (Precision != 0)
        {
            param.Precision = Precision;
        }
        if (Scale != 0)
        {
            param.Scale = Scale;
        }
        if (Size != 0)
        {
            param.Size = Size;
        }

        // Add the parameter to the collection of params
        command.Parameters.Add(param);
    }

param.DbType = DbType;为OleDdParameter设置DateTime时,它还会自动将DBTimeStamp设置为OleDbType。这是一个众所周知的错误。你可以看到,例如在这里:Trying to insert DateTime.Now into Date/Time field gives "Data type mismatch" error 因此,除非有更改,否则可能无法使用log4net将DateTime值插入ms-access。