AdoNetAppender и поле Clob - PullRequest
       15

AdoNetAppender и поле Clob

0 голосов
/ 11 августа 2010

У меня есть приложение asp.net 3.5, которое использует log4Net и AdoNetAppender. В настоящее время приложение использует поле сообщения так же, как документация 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

Ответы [ 2 ]

0 голосов
/ 14 июля 2014

Я знаю, что это старый вопрос, но недавно мне нужно было передать параметр CLOB в процедуру пакета, используя log4net.Я не смог сделать это, используя рекомендации, которые я нашел в Интернете, в том числе с установкой DbType в String и удалением Size.

Я использую процедуру пакета Oracle, которая принимает параметр типа CLOB.Используя пользовательский AdoNetAppenderParameter, я могу передать процедуре длинные строки (270k + символов) и сохранить их в БД (Oracle 9i).

Прежде всего, мне пришлось использовать поставщик доступа к данным Oracle (в конце концов, Microsoft. System.Data.OracleClient был устарел ).Ваш проект должен ссылаться на Oracle.DataAccess.dll.Я получил пакет NuGet, выполнив поиск «oracle.dataaccess» в диспетчере пакетов NuGet.

В библиотеке есть реализация DbParameter, OracleParameter , которая имеет свойство OracleDbType.Тип свойства OracleDbType , который является перечислением со значением Clob .

После добавления ссылки я изменил тип соединения приложения:

<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 и установил для свойства OracleDbType значение Clob внутри метода Prepare.

После создания класса я добавил параметр в конфигурацию приложенияПримерно так:

<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>

Надеюсь, это поможет.

0 голосов
/ 11 августа 2010

Вы пробовали это:

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

В основном вам нужно установить DbType на string и удалить параметр Size.Очевидно, это не работает правильно для nvarchar (max) (см. здесь ), но это не значит, что оно не будет работать для Clob.

...