我今天开始使用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的跟踪,我已经在此问题中包含了该跟踪。
答案 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。