2016-07-22 9 views
2

Ich entwickle auf C# und ich suchte nach einer Möglichkeit, Protokolldateien und Datenbank effizient zu protokollieren. Ich habe Log4Net gefunden. Meine Appender funktionieren gut und ich kann in meiner Datenbank schreiben. Ich würde gerne wissen, ob es möglich ist, das Ergebnis einer gespeicherten Prozedur über Log4Net zu erhalten.Log4Net, Wie bekomme ich das Ergebnis einer gespeicherten Prozedur?

Ich erkläre: Ich habe zwei Appender ("Add" und "Update"), die zwei verschiedene gespeicherte Prozeduren ("sp_AjouterEntree" und "sp_UpdateEntree") auf SQLserver aufruft. Die erste Prozedur fügt eine Zeile zur Tabelle hinzu, die zweite aktualisiert diese Zeile mit einer Fehlermeldung (falls es eine gibt) und einem "EndDate" der Aufgabe.

Der Primärschlüssel der Tabelle ist eine ID. Diese ID wird automatisch von der ersten Prozedur ("Hinzufügen") ausgewählt. Was ich brauche, ist, die Rückgabe @@ Identite der ersten Prozedur zu erhalten, um zu wissen, welche Zeile ich später im zweiten Appender "Update" aktualisieren muss.

Ich hoffe meine Frage ist klar genug. Ich habe die Antwort auf andere Diskussion gesucht, aber anscheinend hatte niemand dieses Problem zuvor.

Vielen Dank für Ihre Hilfe.

Die gespeicherte Prozedur (Zeile hinzufügen):

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 

Die gespeicherte Prozedur (Update Line):

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 

Die erste appender:

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

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

_ "Was ich brauche, ist die Rückkehr @@ Identität des ersten Verfahrens zu erhalten zu wissen, welche Linie ich später aktualisieren müssen in der zweite Appender "_ Nun, Sie können nicht, out of the Box - der log4net-Code weiß nicht, oder was sich Ihre gespeicherte Prozedur tut oder zurückgibt. Ich nehme an, dass Sie dies mit einem benutzerdefinierten Appender tun können. – stuartd

+0

Ok, danke trotzdem. Ich denke, ich werde ein anderes Log-Tool ausprobieren. – yoann

Antwort

-1

Hier ist mein Code der gespeicherten Prozedur

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

"Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. " –

+0

Wenn du sicher bist, dass dein Code korrekt ist, versuche es zu erklären. – MetaColon