Введите базу данных доступа по дате и времени

Я начал работать с log4net сегодня. Все началось очень хорошо, и я получил свои первые текстовые файлы журналов для своего приложения. Затем я сделал следующий шаг и попытался войти в Accessdatabase log_db.accdb в таблице t_log_dat. Сначала это обернулось неудачей, и я смог записать данные типа string и int32. И проблемы начались, когда я попытался включить метку времени как Datetime. вот мои основные настройки для приложения и то, что я пробовал до сих пор для параметра @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>

Однако у меня ничего из вышеперечисленного не сработало. При создании приложения я всегда получаю следующую ошибку

log4net: ОШИБКА [AdoNetAppender] Код ошибки: GenericFailure. Исключение при записи в базу данных System.Data.OleDb.OleDbException (0x80040E07): Datentypenkonflikt в Kriterienausdruck. bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult hr)

ИЗМЕНИТЬ - ошибка преобразуется в

Несоответствие типа данных

Кто-нибудь знает, как я могу ввести метку времени в базе данных доступа с помощью log4net?

PS: этот вопрос отличается от настройки log4net для записи в базу данных , поскольку я специально пытаюсь выяснить, как записать значение даты и времени в базу данных доступа с помощью log4net. Упомянутый выше поток просто запрашивает общую помощь при записи в базу данных с помощью log4net. Также предоставленный ответ просто показывает, как активировать трассировку для log4net, которую я уже включил в этот вопрос.


person jan-seins    schedule 05.09.2016    source источник
comment
Возможный дубликат Настройка log4net для записи в базу данных   -  person MethodMan    schedule 05.09.2016
comment
Вам понадобится значение, соответствующее типу данных столбца [dt_timestanp].   -  person stuartd    schedule 06.09.2016
comment
Да, dt_timestanp - это значение DateTime. в моей третьей попытке я надеялся получить его. Но все та же ошибка.   -  person jan-seins    schedule 06.09.2016


Ответы (1)


Я получил источник от https://github.com/apache/log4net, и я не думаю можно вставить 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; устанавливает DateTime для OleDdParameter, он также автоматически устанавливает DBTimeStamp как OleDbType. Это хорошо известная ошибка. Вы можете увидеть, например, здесь: Попытка insert DateTime.Now в поле Date / Time дает ошибку несоответствия типа данных Таким образом, если там нет изменений, вероятно, невозможно вставить значение DateTime в ms-доступ с помощью log4net.

person jan-seins    schedule 09.09.2016