输入日期时间访问数据库

Enter datetime access database

我今天开始使用 log4net。它开始非常顺利,我为我的应用程序获得了第一个基于文本的日志文件。然后我采取了下一步并尝试在 table t_log_dat 中登录 Access 数据库 log_db.accdb。起初这很糟糕,我能够记录字符串和 int32 类型的数据。当我尝试将时间戳包含为日期时间时,问题就开始了。这是我对 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 访问中的规范。像这样的 '2015-08-09 09:23:00'

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

但是,上面的 none 对我有用。我在构建应用程序时总是收到以下错误

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database System.Data.OleDb.OleDbException (0x80040E07): Datentypenkonflikt in Kriterienausdruck. bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)

编辑 - 错误转换为

Data Type Mismatch

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

P.S.: 这个问题不同于 ,因为我专门想弄清楚如何使用 log4net 将日期时间值写入访问数据库。上面提到的线程只是请求使用 log4net 写入数据库的一般帮助。此外,提供的答案仅显示如何激活 log4net 的跟踪,我已经将其包含在这个问题中。

我从 https://github.com/apache/log4net 获得了来源,我认为不可能将 DateTime 插入 access atm。 问题是 AdoNetAppender.cs:

中的函数 prepare
        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 将日期时间值插入 ms-access。