2015-04-08 3 views
3

У меня есть log4net, регистрирующийся в моем приложении .net 3.5. Ведение журнала вставляется в базу данных. Одна из проблем, которые возникают у меня, заключается в том, что для базы данных, в которой я не устанавливаю данные, она вставляет «NULL» вместо базы данных null. Моя конфигурация являетсяlog4net AdoNetAppender вставляет строку «Null» вместо нулевого в базе данных

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
    <immediateFlush value="true" /> 
    <bufferSize value="0" /> 
    <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /> 
    <connectionString value="data source=localhost;initial catalog=logging_db;User ID=root;Password=" /> 
    <commandText value="INSERT INTO system_log(appname, action,context_id) 
       VALUES (@appname, @action, @context_id);" /> 
    <parameter> 
     <parameterName value="appname" /> 
     <dbType value="String" /> 
     <size value="10" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="My Web Service" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="action" /> 
     <dbType value="String" /> 
     <size value="45" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%5c{1}.%M" /> 
     </layout> 
    </parameter> 
    <parameter> 
     <parameterName value="context_id" /> 
     <dbType value="String" /> 
     <size value="48" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%X{context_id}" /> 
     </layout> 
    </parameter> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
     <acceptOnMatch value="true" /> 
     <levelMin value="DEBUG" /> 
     <levelMax value="FATAL" /> 
    </filter> 
    </appender> 

В некоторых методах я устанавливающие context_id в моем методе, как

log4net.LogicalThreadContext.Properties["context_id"] = "My context"; 

Он прекрасно вставляя, где я предоставил его, но неправильно, когда я не поставил его. Я также проверил этот вопрос на https://issues.apache.org/jira/browse/LOG4NET-28 но он помечается как решенное

ответ

3

Вы можете изменить INSERT INTO заявления для проверки «NULL» строка и заменить их DB нули, идея из here

Так это будет выглядеть следующим образом:

INSERT INTO system_log(appname, action,context_id) VALUES (@appname, @action, CASE WHEN @context_id = 'NULL' THEN NULL ELSE @context_id END);" 

UPDATE

Чтобы использовать вместо хранимой процедуры, просто repla ce ваше заявление вот так:

exec YourStoredProcedure @appname, @action, @context_id 
+0

Это последнее, что я хочу, если никакое другое решение не найдено. Любая идея, если я могу настроить хранимую процедуру вместо инструкции insert? –

+0

Спасибо большое Szeki –

+0

@KamranShahid приветствую - я обновил ответ, чтобы позвонить в хранимую процедуру – Szeki

-1

Для этой ситуации я предпочитаю использовать спусковой крючок. Либо ON INSERT или INSTEAD OF INSERT (см https://technet.microsoft.com/en-us/library/ms175089(v=sql.105).aspx)

Я хотел бы сделать Somthing как:

CREATE TRIGGER dbo.log_onInsert 
    ON system_log 
    INSTEAD OF INSERT 
AS 
BEGIN 
SET NOCOUNT ON; 

INSERT INTO system_log(appname, action,context_id) 
select 
    appname, action, 
    case when inserted.context_id='(null)' then null else inserted.context_id end 
from inserted 

END 
GO 
+0

Вопрос уже дан Давид –

+1

Ответ от Szeki был одним из решений, а мой - другим. Программирование редко или никогда не имеет одного решения проблемы. Это не мотивирует downwote. –

+0

Я согласился с вашими мыслями. Но по моему 12-летнему опыту, использование триггера не рекомендуется для любого случая. Ваше решение будет большим узким местом производительности –