2010-08-10 2 views
0

У меня есть приложение asp.net 3.5, использующее log4Net и AdoNetAppender. В настоящее время приложение использует поле сообщения, как документация log4net http://logging.apache.org/log4net/release/config-examples.html. Я хотел бы преобразовать поле из varchar2 в Clob. Я пытался найти документацию о том, как это сделать. Все, что я смог найти:Поле AdoNetAppender и Clob

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

, который был не слишком полезно. Кто-нибудь знает ссылку или некоторые примеры того, как использовать файл Clob с AdoNetAppender?

Спасибо, Билл N

ответ

0

вы попробуете ли это:

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

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

0

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

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

Прежде всего, мне пришлось использовать поставщик доступа к данным Oracle (в конце концов, Microsoft 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); 
    } 
} 

I выставил свойство, OracleDbType, поэтому я мог бы указать его через конфигурацию.

Первоначально я не раскрыл свойство, названное классом OracleClobAdoNetAppenderParameter, и установил свойство OracleDbType в Clob внутри метода Prepare.

После того как я создал класс, я добавил параметр в конфигурацию 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> 

Надеется, что это помогает.

Смежные вопросы