输入datetime访问数据库

本文关键字:数据库 访问 datetime 输入 | 更新日期: 2023-09-27 18:05:33

我今天开始使用log4net。它开始得非常好,我为我的应用程序获得了第一个基于文本的日志文件。然后,我采取了下一步,并尝试登录到访问数据库log_db。表t_log_dat中的Accdb。这在一开始很好,我能够记录类型为string和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)" />

First Try:如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>

Second Try: operactstring,所以它符合插入到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>

然而,以上都不适合我。当我构建我的应用程序

时,我总是得到以下错误

log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure。写入数据库时出现异常system . data . oledb . oledbeexception(0x80040E07): Datentypenkonflikt in Kriterienausdruck。贝System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult人力资源)

EDIT - Error翻译成

数据类型不匹配

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

注::这个问题与配置log4net在数据库上写入不同,因为我特别想弄清楚如何使用log4net向访问数据库写入日期时间值。上面提到的线程只是要求使用log4net编写数据库的一般帮助。此外,所提供的答案仅显示了如何激活log4net的跟踪,我已经将其包含在这个问题中。

输入datetime访问数据库

我从https://github.com/apache/log4net获得了源代码,我认为不可能在访问atm中插入DateTime。问题是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。这是一个众所周知的错误。你可以看到下面的例子:尝试插入日期时间。现在在Date/Time字段中显示"数据类型不匹配";错误因此,除非有更改,否则可能无法使用log4net在ms-access中插入DateTime-value。