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>
_ "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
Ok, danke trotzdem. Ich denke, ich werde ein anderes Log-Tool ausprobieren. – yoann