首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AdoNetAppender和Clob字段

AdoNetAppender和Clob字段
EN

Stack Overflow用户
提问于 2010-08-11 04:27:41
回答 2查看 991关注 0票数 0

我有一个使用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

这并不是很有用。有谁知道如何在AdoNetAppender中使用Clob文件的链接或示例吗?

谢谢,Bill N

EN

回答 2

Stack Overflow用户

发布于 2010-08-11 17:11:49

你有没有试过这个:

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-14 05:48:41

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

我正在使用一个Oracle包过程,它接受CLOB类型的参数。使用自定义AdoNetAppenderParameter,我能够将长字符串(270k+字符)传递给该过程,并将它们存储在DB (Oracle9i)中。

首先,我必须使用甲骨文的数据访问提供程序(毕竟,微软的System.Data.OracleClient一直是deprecated)。您的项目必须引用Oracle.DataAccess.dll。我在NuGet包管理器中搜索"oracle.dataaccess“得到了NuGet包。

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

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

代码语言:javascript
复制
<connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

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

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
<parameter type="YourNamespace.OracleAdoNetAppenderParameter, YourAssembly">
    <OracleDbType value="Clob" />
    <parameterName value=":yourProcedureClobParam"/>
    <layout type="..."></layout>
 </parameter>

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

下面是我使用的最终配置:

代码语言:javascript
复制
<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>

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3453126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档