【问题标题】:AdoNetAppender and Clob fieldAdoNetAppender 和 Clob 字段
【发布时间】:2011-03-28 01:22:30
【问题描述】:

我有一个使用 log4Net 和 AdoNetAppender 的 asp.net 3.5 应用程序。目前,该应用程序使用消息字段,就像 log4net 文档 http://logging.apache.org/log4net/release/config-examples.html 一样。我想将字段从 varchar2 转换为 Clob。我试图找到一些有关如何执行此操作的文档。我只能找到:

http://old.nabble.com/DbType-for-CLOB-column-using-AdoNetAppender-td1214036.html#a1214036

这不是太有用。有谁知道如何将 Clob 文件与 AdoNetAppender 一起使用的链接或一些示例?

谢谢,比尔 N

【问题讨论】:

    标签: log4net adonetappender


    【解决方案1】:

    你试过了吗:

    http://marc.info/?l=log4net-user&m=110874200319166

    基本上您需要将DbType 设置为string 并删除Size 参数。显然这不适用于 nvarchar(max)(请参阅 here),但这并不意味着它不适用于 Clob。

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但我最近需要使用 log4net 将 CLOB 参数传递给包过程。使用我在网上找到的建议,包括将 DbType 设置为 String 并删除 Size 的建议,我无法做到这一点。

      我正在使用一个采用 CLOB 类型参数的 Oracle 包过程。使用自定义 AdoNetAppenderParameter 我可以将长字符串(270k+ 个字符)传递给过程并将它们存储在数据库中(Oracle 9i)。

      首先,我不得不使用Oracle的Data Access Provider(毕竟微软的System.Data.OracleClient一直是deprecated)。您的项目必须引用 Oracle.DataAccess.dll。我通过在 NuGet 包管理器中搜索“oracle.dataaccess”获得了 NuGet 包。

      该库有一个 DbParameter 实现,OracleParameter,它具有 OracleDbType 属性。属性的类型是OracleDbType,它是一个具有Clob 值的枚举。

      添加引用后,我将appender的连接类型改为:

      <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      

      然后我创建了一个自定义的 AdoNetAppenderParameter,它创建了一个新的 OracleParameter 并将其类型设置为 Clob:

      public class OracleAdoNetAppenderParameter : AdoNetAppenderParameter
      {
          public OracleDbType OracleDbType { get; set; }
      
          public override void Prepare(System.Data.IDbCommand command)
          {
              if (!(command is OracleCommand))
              {
                  string message = string.Format("The log4net parameter of type {0} can only be used with an appender connection of type {1}. The expected command type, {2}, cannot be supplied. Please check the parent appender's connectionType property.",
                                                   this.GetType(), typeof(OracleConnection), typeof(OracleCommand));
      
                  throw new System.ArgumentException(message, "command");
              }
      
              var parameter = command.CreateParameter() as OracleParameter;
      
              parameter.ParameterName = base.ParameterName;
              parameter.OracleDbType = this.OracleDbType;
      
              command.Parameters.Add(parameter);
          }
      }
      

      我公开了一个属性,OracleDbType,所以我可以通过配置来指定它。

      我最初没有公开该属性,将类命名为 OracleClobAdoNetAppenderParameter 并在 Prepare 方法中将 OracleDbType 属性设置为 Clob。

      创建类后,我将参数添加到 appender 的配置中,如下所示:

      <parameter type="YourNamespace.OracleAdoNetAppenderParameter, YourAssembly">
          <OracleDbType value="Clob" />
          <parameterName value=":yourProcedureClobParam"/>
          <layout type="..."></layout>
       </parameter>
      

      您可以使用自己的布局。我将我的大字符串作为自定义参数传递给 log4net 的上下文。

      这是我使用的最终配置:

      <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
            <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
            <connectionString value="data source=xxx;User ID=xxx;Password=xxx"/>
            <commandText value="MY_PKG.LogMessage"/>
            <commandType value="StoredProcedure" />
            <!-- SERVICE_MESSAGE -->
            <parameter type="MyNamespace.OracleAdoNetAppenderParameter, MyAssembly">
              <OracleDbType value="Clob" />
              <parameterName value=":service_message"/>
              <layout type="log4net.Layout.RawPropertyLayout">
                <key value="service_message"/>
              </layout>
            </parameter>
            <!-- LOG_LEVEL -->
            <parameter>
              <parameterName value=":type"/>
              <dbType value="String"/>
              <size value="20"/>
              <layout type="log4net.Layout.PatternLayout" value="%level"/>
            </parameter>
            <!-- LOG_DATE -->
            <parameter>
              <parameterName value=":timestamp"/>
              <dbType value="DateTime"/>
              <layout type="log4net.Layout.RawTimeStampLayout" />
            </parameter>
            <!-- MESSAGE -->
            <parameter>
              <parameterName value=":message"/>
              <dbType value="String"/>
              <size value="1000"/>
              <layout type="log4net.Layout.PatternLayout" value="%message"/>
            </parameter>
            <!-- EXCEPTION -->
            <parameter>
              <parameterName value=":error"/>
              <dbType value="String"/>
              <size value="4000"/>
              <layout type="log4net.Layout.ExceptionLayout"/>
            </parameter>
      ......
      </appender>
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2016-07-12
        • 1970-01-01
        • 2021-12-09
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多