输入日期时间访问数据库
Enter datetime access database
我今天开始使用 log4net。它开始非常顺利,我为我的应用程序获得了第一个基于文本的日志文件。然后我采取了下一步并尝试在 table t_log_dat 中登录 Access 数据库 log_db.accdb。起初这很糟糕,我能够记录字符串和 int32 类型的数据。当我尝试将时间戳包含为日期时间时,问题就开始了。这是我对 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 访问中的规范。像这样的 '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>
但是,上面的 none 对我有用。我在构建应用程序时总是收到以下错误
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database System.Data.OleDb.OleDbException
(0x80040E07): Datentypenkonflikt in Kriterienausdruck. bei
System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult
hr)
编辑 - 错误转换为
Data Type Mismatch
有谁知道如何使用 log4net 在访问数据库中输入时间戳?
P.S.: 这个问题不同于 ,因为我专门想弄清楚如何使用 log4net 将日期时间值写入访问数据库。上面提到的线程只是请求使用 log4net 写入数据库的一般帮助。此外,提供的答案仅显示如何激活 log4net 的跟踪,我已经将其包含在这个问题中。
我从 https://github.com/apache/log4net 获得了来源,我认为不可能将 DateTime 插入 access atm。
问题是 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。这是一个众所周知的错误。你可以看到例如这里:Trying to insert DateTime.Now into Date/Time field gives "Data type mismatch" error
因此,除非有更改,否则可能无法使用 log4net 将日期时间值插入 ms-access。
我今天开始使用 log4net。它开始非常顺利,我为我的应用程序获得了第一个基于文本的日志文件。然后我采取了下一步并尝试在 table t_log_dat 中登录 Access 数据库 log_db.accdb。起初这很糟糕,我能够记录字符串和 int32 类型的数据。当我尝试将时间戳包含为日期时间时,问题就开始了。这是我对 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 访问中的规范。像这样的 '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>
但是,上面的 none 对我有用。我在构建应用程序时总是收到以下错误
log4net:ERROR [AdoNetAppender] ErrorCode: GenericFailure. Exception while writing to database System.Data.OleDb.OleDbException (0x80040E07): Datentypenkonflikt in Kriterienausdruck. bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
编辑 - 错误转换为
Data Type Mismatch
有谁知道如何使用 log4net 在访问数据库中输入时间戳?
P.S.: 这个问题不同于
我从 https://github.com/apache/log4net 获得了来源,我认为不可能将 DateTime 插入 access atm。 问题是 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。这是一个众所周知的错误。你可以看到例如这里:Trying to insert DateTime.Now into Date/Time field gives "Data type mismatch" error
因此,除非有更改,否则可能无法使用 log4net 将日期时间值插入 ms-access。