【问题标题】:NLog to Database (Oracle)NLog 到数据库 (Oracle)
【发布时间】:2023-08-27 11:21:01
【问题描述】:

我正在尝试使用 NLog 记录到 Oracle 数据库,已经创建了表,但是当我尝试记录某些内容时出现异常:

ORA-00928:缺少 SELECT 关键字

我的 NLog.config 文件是:

<?xml version="1.0" ?>
<nlog autoReload="true" throwExceptions="true" internalLogFile="${basedir}/App_Data/nlog.txt" internalLogLevel="Debug"
      internalLogToConsole="true">

  <targets>
    <!--Useful for debugging-->
    <target name="filelog" type="File" fileName="C:/App_Data/Site.log"
     layout="${date}: ${message}" />

    <target name="databaselog" type="Database">

      <dbProvider>Oracle.DataAccess.Client</dbProvider>

      <!-- database connection parameters -->
      <!-- alternatively you could provide a single 'connectionstring' parameter -->
      <connectionString>DATA SOURCE=database;PERSIST SECURITY INFO=True;USER ID=user;Password=password;Validate Connection=true</connectionString>

      <commandText>
        insert into RS_LOGTABLE ([log_user],[log_level],[log_date],[log_message]) values(@log_user,@log_level,@log_date,@log_message);
      </commandText>

      <parameter name="@log_user" layout="${message}"/>
      <parameter name="@log_level" layout="${message}"/>
      <parameter name="@log_date" layout="${date}"/>
      <parameter name="@log_message" layout="${message}"/>

    </target>

  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="filelog" />
    <logger name="*" minlevel="Trace" writeTo="databaselog" />
  </rules>

</nlog>

当我这样做时会发生异常:

logger = LogManager.GetCurrentClassLogger();
logger.Debug("Teste logger");

我已经尝试过不带括号的插入并得到另一个异常:

**ORA-00936: missing expression**

【问题讨论】:

  • 查看this page 上的 second 示例以获取 Oracle 示例,尽管它使用了 System.Data.OracleClient
  • 现在我得到 ORA-01036: 非法变量名/编号...

标签: c# oracle nlog


【解决方案1】:

我想这对你来说有点晚了,但我希望我的解决方案对其他人有所帮助。

我在commandTextparameter 标记处更改了字符@ 的冒号,我完全删除了它。我不使用括号,它开始工作了。

这样应该是正确的:

<commandText>
    insert into RS_LOGTABLE (log_user,log_level,log_date,log_message) values(:log_user,:log_level,:log_date,:log_message);
</commandText>

<parameter name="log_user" layout="${message}"/>
<parameter name="log_level" layout="${message}"/>
<parameter name="log_date" layout="${date}"/>
<parameter name="log_message" layout="${message}"/>

我用 dbProvider Oracle.DataAccess.Client 对其进行了测试。

对他人的警告: 我有一个用保留字命名的变量,它引发了另一个异常。更多详情在这里PHP ORA-01745: invalid host/bind variable name Warning

【讨论】: