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.