2010-08-10 16 views
0

J'ai une application asp.net 3.5 qui utilise log4Net et AdoNetAppender. Actuellement, l'application utilise un champ de message comme la documentation log4net http://logging.apache.org/log4net/release/config-examples.html. Je voudrais convertir le champ de varchar2 en Clob. J'essayais de trouver de la documentation sur la façon de le faire. Tout ce que je pouvais trouver est:Champ AdoNetAppender et Clob

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

qui était pas trop utile. Est-ce que quelqu'un connaît un lien ou des exemples sur la façon d'utiliser un fichier Clob avec un AdoNetAppender?

Merci, Bill N

Répondre

0

Avez-vous essayé ceci:

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

fondamentalement, vous devez définir l'DbType-string et supprimer le paramètre Size. Apparemment, cela ne fonctionne pas correctement pour nvarchar (max) (voir here) mais cela ne signifie pas que cela ne fonctionnera pas pour Clob.

0

Je sais que c'est une vieille question, mais j'ai récemment dû passer un paramètre CLOB à une procédure de paquet, en utilisant log4net. Je n'étais pas capable de le faire en utilisant les suggestions que j'ai trouvées en ligne, y compris celle avec la définition du DbType à la chaîne et la suppression de la taille.

J'utilise une procédure de package Oracle qui prend un paramètre de type CLOB. En utilisant un AdoNetAppenderParameter personnalisé, je suis capable de passer de longues chaînes (270k + caractères) à la procédure et de les stocker dans la base de données (Oracle 9i). Tout d'abord, j'ai dû utiliser Data Access Provider d'Oracle (après tout, System.Data.OracleClient de Microsoft a été deprecated). Votre projet doit référencer Oracle.DataAccess.dll. J'ai obtenu le paquet NuGet en cherchant "oracle.dataaccess" dans le gestionnaire de paquets NuGet.

La bibliothèque a une implémentation de DbParameter, OracleParameter, qui possède une propriété OracleDbType. Le type de la propriété est OracleDbType qui est une énumération qui a la valeur Clob.

Après avoir ajouté la référence, j'ai changé le type de connexion du appender à:

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

J'ai ensuite créé un AdoNetAppenderParameter personnalisé qui crée une nouvelle OracleParameter et définit son type à 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 exposé une propriété, OracleDbType, donc je serais en mesure de le spécifier via la configuration.

Initialement, je n'ai pas exposé la propriété, nommé la classe OracleClobAdoNetAppenderParameter et défini la propriété OracleDbType sur Clob dans la méthode Prepare.

Après avoir créé la classe, j'ai ajouté le paramètre à la configuration de appender, comme ceci:

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

Vous pouvez utiliser votre propre mise en page. Je passe ma grande chaîne dans le contexte de log4net en tant que paramètre personnalisé.

est ici la configuration finale j'utilise:

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

Hope it helps.