输入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的跟踪,我已经将其包含在这个问题中。
我从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。