Поле AdoNetAppender и Clob

79
7

У меня есть приложение 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

спросил(а) 2021-01-19T12:23:33+03:00 9 месяцев назад
1
Решение
104

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


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


Прежде всего, мне пришлось использовать Oracle Data Access Provider (в конце концов, Microsoft System.Data.OracleClient был устарел). Ваш проект должен ссылаться на 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 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.


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

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

ответил(а) 2021-01-19T12:23:33+03:00 9 месяцев назад
46

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


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

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

ответил(а) 2021-01-19T12:23:33+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема