2016-07-22 65 views
2

我正在C#上進行開發,我正在尋找一種有效登錄日誌文件和數據庫的方法。我找到了Log4Net。我的appender工作正常,我可以在我的數據庫中寫入。我想知道是否有可能通過Log4Net獲取存儲過程的結果。我有兩個appender(「Add」和「Update」)在SQLserver上調用兩個不同的存儲過程(「sp_AjouterEntree」和「sp_UpdateEntree」)。第一個過程在表中添加一行,第二個過程用錯誤消息(如果有)和該任務的「EndDate」更新該行。Log4Net,如何獲取存儲過程的結果?

該表的主鍵是一個ID。該ID由第一個程序自動選擇(「添加」)。 我需要的是接收第一個程序的返回@@ identite以知道哪一行我需要在第二個appender「Update」中更新。

我希望我的問題很清楚。 我在其他討論中尋找答案,但顯然之前沒有人遇到過這個問題。

謝謝你的幫助。

存儲過程(添加線):

ALTER PROCEDURE [dbo].[sp_AjouteEntree] 
@Flux varchar(50), @Etape varchar(200),@Debut datetime2(7),@Fin datetime2(7),@EtapeKO bit, @Erreur varchar(max) , @Annexe varchar(max) 
AS 
BEGIN 



INSERT INTO [dbo].[Journal] 
     ([Jour_Flux] 
     ,[Jour_Etape_Flux] 
     ,[Jour_Date_Heure_Debut] 
     ,[Jour_Date_Heure_Fin] 
     ,[Jour_Etape_KO] 
     ,[Jour_Erreur] 
     ,[Jour_Annexe]) 
VALUES 
     (@Flux 
     ,@Etape 
     ,@Debut 
     ,@Fin 
     ,@EtapeKO 
     ,@Erreur 
     ,@Annexe) 



return @@IDENTITY 
END 

存儲過程(更新線):

ALTER PROCEDURE [dbo].[sp_UpdateEntree] 
@Id integer,@Fin datetime2(7),@EtapeKO bit, @Erreur varchar(max) ,@Annexe varchar(max) 
AS 
BEGIN 


UPDATE [dbo].[Journal] 
SET [Jour_Date_Heure_Fin] = @Fin 
    ,[Jour_Etape_KO] = @EtapeKO 
    ,[Jour_Erreur] = @Erreur 
    ,[Jour_Annexe] = @Annexe 
WHERE [Jour_ID][email protected] 


END 

第一附加器:

<appender name="Add" type="log4net.Appender.AdoNetAppender"> 
<bufferSize value="1" /> 
<threshold value="WARN" /> 
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
<connectionString value="data source=******************;Database=Test_Log4Net;Trusted_Connection=yes" /> 

<commandText value="sp_AjouteEntree" /> 
<commandType value="StoredProcedure"/> 

<parameter> 
    <parameterName value="@Flux" /> 
    <dbType value="AnsiString" /> 
    <size value="50" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{FluxName}" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Etape" /> 
    <dbType value="AnsiString" /> 
    <size value="500" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%method" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Debut" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.RawTimeStampLayout"/> 
</parameter> 

<parameter> 
    <parameterName value="@Fin" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.RawTimeStampLayout"/> 
</parameter> 

<parameter> 
    <parameterName value="@EtapeKO" /> 
    <dbType value="Byte" /> 
    <size value="1" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{ErreurKO}" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Erreur" /> 
    <dbType value="AnsiString" /> 
    <size value="2000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="NULL" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Annexe" /> 
    <dbType value="AnsiString" /> 
    <size value="5000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message" /> 
    </layout> 
</parameter> 

的第二個appender:

<appender name="Update" type="log4net.Appender.AdoNetAppender"> 
<bufferSize value="1" /> 

<threshold value="WARN" /> 

<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 

<connectionString value="data source=*****************;Database=Test_Log4Net;Trusted_Connection=yes" /> 

<commandText value="sp_UpdateEntree" /> 
<commandType value="StoredProcedure"/> 

<parameter> 
    <parameterName value="@Id" /> 
    <dbType value="Int32" /> 
    <size value="50" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{ID}" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Fin" /> 
    <dbType value="DateTime" /> 
    <layout type="log4net.Layout.RawTimeStampLayout"/> 
</parameter> 

<parameter> 
    <parameterName value="@EtapeKO" /> 
    <dbType value="Byte" /> 
    <size value="1" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{ErreurKO}" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Erreur" /> 
    <dbType value="AnsiString" /> 
    <size value="2000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{messageErreur}" /> 
    </layout> 
</parameter> 

<parameter> 
    <parameterName value="@Annexe" /> 
    <dbType value="AnsiString" /> 
    <size value="5000" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message" /> 
    </layout> 
</parameter> 

+0

_「我需要的是接受的第一個程序的返回@@身份知道我需要後來在更新該行第二個appender「_唔,開箱即用 - log4net代碼不知道或不關心你的存儲過程做了什麼或返回。我希望你可以用自定義的appender做到這一點。 – stuartd

+0

好的,謝謝。我想我會嘗試其他日誌工具。 – yoann

回答

-1

這裏是我的存儲過程的代碼

USE [JainPort114] 
GO 
/****** Object: StoredProcedure [dbo].[GetEventValveONOFF] Script Date: 17-Apr-17 9:18:14 AM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[GetEventValveONOFF] 
    [email protected] int, @StartDatetime datetime, @Enddatetime datetime, 
    [email protected] int, @Zoneid int, @BlockId int 
    @WhereCondition nvarchar(max) , @StartDatetime nvarchar(100), @Enddatetime nvarchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    --If only 1 zone is selected 

     begin 
      DECLARE @SQL NVARCHAR(MAX) 
      print @StartDatetime 
      print @Enddatetime 

      SELECT @SQL = 'select be.eventdatetime,''Valve Event'' as eventtype, elest.status as ''status'' , 
       r.rtuname, c.channelname,c.channelid, c.tagname, c.tagname as description, 
       (select d.Type from DigitalOutput d where d.DOId = c.typeid and c.subtypeid = 0 and c.EqpTypeId =4) as SensorType, 
       --(select Reason from JainPort114_events.dbo.ElementTypeReason where ReasonId = be.Reason and ElementTypeId = 4) as Reason, 
       --(select EleTypeReasonId from JainPort114_events.dbo.ElementTypeReason where ReasonId = be.Reason and ElementTypeId = 4) as ReasonId 
       etr.Reason, etr.ReasonId, 
       case when be.Reason = 8 then (Select be.Errorcode) 
        when be.Reason = 9 then (Select be.Errorcode) 
       else 0 
       end as moidruleid    
       from JainPort114_events.dbo.BSTEvents b, JainPort114_events.dbo.BSTEventsConfig be, rtu r, network n, channel c , JainPort114_events.dbo.ElementTypeReason etr,JainPort114_events.dbo.elementstatus elest 
       where be.bsteventid = b.BSTEventsId 
       and c.rtuid = r.rtuid 
       and r.networkid = n.networkid 
       and elest.EleStatusId = be.elestatus 
       and be.EventDateTime between '''+ @StartDatetime + ''' and ''' + @Enddatetime + ''' 
       and b.NetworkId = (select networkno from network where NetworkId = r.networkid) 
       and b.NetworkId = n.networkno 
       and JainPort114_events.dbo.HextoDEC(SUBSTRING (be.elenumberandtype, 1, 2), 16) = r.rtuidinnw 
       and JainPort114_events.dbo.HextoDEC(SUBSTRING (be.elenumberandtype, 3, 2), 16) = c.slotidinrtu 
       and c.slotidinrtu = be.number 
       and etr.ElementTypeId = 4 
       and etr.ReasonId = be.Reason 
        --and n.networkid = @networkId and r.rtuid = @RTUID 
       --and etr.ReasonId = 13 
       and r.active =1' 
        [email protected] 
        +'order by be.eventdatetime desc' 
        PRINT @SQL 
      EXEC sys.sp_executesql @SQL 

     End   
END 
+0

「這不能提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。「 –

+0

如果您確定自己的代碼是正確的,請嘗試對其進行解釋。 – MetaColon

相關問題