2016-09-05 7 views
1

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

Первый 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> 

Второй Try: Манипулировать строку, поэтому следует спецификация для вставки в доступе мс. Что-то вроде этого '2015-08-09 9: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> 

My Last Try, чтобы использовать основной log4net RawTimestampLayout

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

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

log4net: ERROR [AdoNetAppender] ErrorCode: GenericFailure. Исключение при записи в базу данных System.Data.OleDb.OleDbException (0x80040E07): Datentypenkonflikt в Kriterienausdruck. бей System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling (OleDbHResult ч)

EDIT - Ошибка Переводит в

Тип данных рассогласование

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

P.S .: Этот вопрос отличается от Configuring log4net to write on a database, так как я специально пытаюсь выяснить, как записать значение datetime в базу данных доступа, используя log4net. В упомянутой выше теме просто запрашивается общая помощь для записи в базу данных с использованием log4net. Также предоставленный ответ показывает, как активировать трассировку для log4net, которую я уже включил в этот вопрос.

+0

Возможный дубликат [Настройка log4net для записи в базе данных] (http: // stackoverflow.com/questions/28024282/configuring-log4net-to-write-on-a-database) – MethodMan

+0

Вам понадобится значение, соответствующее типу данных столбца '[dt_timestanp]' – stuartd

+0

Да, dt_timestanp - значение DateTime , в моей третьей попытке я надеялся получить его. Но все та же ошибка. –

ответ

0

У меня есть источник от https://github.com/apache/log4net, и я не думаю, что можно вставить DateTime в atm доступа. Проблема функция подготовки в 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. Это хорошо известная ошибка. Вы можете видеть, например. здесь: Trying to insert DateTime.Now into Date/Time field gives "Data type mismatch" error Таким образом, если нет изменений там, возможно, невозможно вставить значение DateTime в ms-access, используя log4net.