2017-05-24 2 views
1

Ich verwende Dapper in asp.net MVC 4 .net Projekt f/w 4.6.1 SQL Server 2016 ExpressWie verwende ich Dapper, um den Rückgabewert von gespeicherten Proc zu erhalten?

mit
<packages> 
    <package id="Dapper" version="1.50.2" targetFramework="net461" /> 
</packages> 

Ich habe eine gespeicherte Prozedur, die aus zwei Tabellen löscht die

Transaktions sein sollte
ALTER PROCEDURE [dbo].[FeedbackDelete] @FeedbackID UNIQUEIDENTIFIER 
AS 
    SET NOCOUNT OFF 
    SET XACT_ABORT ON 

BEGIN TRANSACTION 
    DELETE 
    FROM dbo.Document 
    WHERE FeedbackId = @FeedbackID 
    IF(@@ERROR != 0) 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN 1 
     END 

    DELETE 
    FROM [dbo].[Feedback] 
    WHERE [FeedbackID] = @FeedbackID 
    IF(@@ERROR != 0 OR @@ROWCOUNT != 1) 
     BEGIN 
      ROLLBACK TRANSACTION 
      RETURN 1 
     END 

COMMIT TRANSACTION 
RETURN 0 

Meine Repo-Methode verwendet adrett wie diese

public Response DeleteFeedback(Guid feedbackId) 
     { 
      string storedProcName = "FeedbackDelete"; 
      int returnValue = int.MinValue; 
      using (var con = Connection) 
      { 
       con.Open(); 
       returnValue = con.Execute(storedProcName, new { feedbackId }, commandType: CommandType.StoredProcedure); 
      } 
      return Convert.ToInt32(returnValue) == 0 ? new Response(Code.Success, "Feedback successfully deleted") : new Response(Code.Failure, "There was an error deleting feedback"); 
     } 

Die return ich 1 ist jedes Mal wh Ich verstehe das, dapper die Anzahl der betroffenen Zeilen zurückgibt.

Allerdings möchte ich den Wert der return-Anweisung meiner gespeicherte Prozedur für Fehler bei der Transaktions zu überprüfen, um bekommen löschen (was in meinem Fall ist 0 für Erfolg und 1 für Fehler)

Wie kann ich erreichen Dies?

Mit blankem Metall ado.net benutzen ich, dies zu tun und es funktionierte

var returnValue = db.ExecuteScalar(storedProcName, new object[] { feedbackId }); 

Mit adrett Ich habe con.ExecuteScalar versucht, die nicht funktionieren, da adrett Metadaten, die skalare zeigt // returns: // Die erste Zelle ausgewählt

Jede Hilfe wird geschätzt? Hier

ist die nächste Prozedur, die ich brauche mit Dapper auszuführen

ALTER PROCEDURE [dbo].[FeedbackUpdate] 
    @DocumentData VARBINARY(MAX), 
    @DocumentName NVARCHAR(100), 
    @FeedbackID UNIQUEIDENTIFIER, 
    @FirstName NVARCHAR(100), 
    @LastName NVARCHAR(100), 
    @Notes NVARCHAR(MAX) 
AS 
    SET NOCOUNT ON 
    SET XACT_ABORT ON 

    BEGIN TRAN 

    UPDATE [dbo].[Feedback] 
    SET [FirstName] = @FirstName, [LastName] = @LastName, [Notes] = @Notes 
    WHERE [FeedbackID] = @FeedbackID 
    IF(@@ERROR != 0 OR @@ROWCOUNT != 1) 
     BEGIN 
      ROLLBACK TRAN 
      RETURN 1 
     END 

    IF DATALENGTH(@DocumentData) > 1 
    BEGIN 

      DELETE 
      FROM [dbo].[Document] 
      WHERE FeedbackId = @FeedbackId 
      IF(@@ERROR != 0) 
       BEGIN 
        ROLLBACK TRAN 
        RETURN 1 
       END 

      INSERT [dbo].[Document] (DocumentData,DocumentName,DocumentId,FeedbackId) 
      VALUES(@DocumentData,@DocumentName,NEWID(),@FeedbackID) 
      IF(@@ERROR != 0 OR @@ROWCOUNT != 1) 
       BEGIN 
        ROLLBACK TRAN 
        RETURN 1 
       END 
     END 

     COMMIT TRAN 
     RETURN 0 
+1

Dies ist völlig off-Thema, aber sparen Sie einige größere Kopfschmerzen. Meistens ist Ihre Abfrage viel schneller, wenn Sie lokale Variablen definieren, diese auf Ihre Eingabeparameter setzen und Ihre lokalen Variablen in Ihrer Abfrage verwenden. Ich habe eine einfache 10x-Leistung von den meisten SPROCs bekommen, indem ich dieses eine Ding gemacht habe. Entschuldige die Ablenkung, aber du wirst mir später danken. – SteveJ

+1

https://stackoverflow.com/questions/14247081/return-values-from-dapper-net-query-with-stored-procedure – SteveJ

+0

@SteveJ Vielen Dank für Ihren interessanten Tipp. Irgendeine Erklärung darüber, warum die Leistung steigt, bevor ich dies mit meinem Team aufbringe und gespeicherte Procs aktualisiere. Ich würde einen starken rationalen Fall für den Umbruch brauchen ;-) –

Antwort

5

definieren müssen können Sie erklären, dynamische params mit Richtung: ReturnValue Sie können auch "select" anstelle von "return" verwenden und Query<T> Erweiterung verwenden.

create procedure sp_foo 
    as 
    begin 
     return 99 
    end 

[Test] 
public void TestStoredProcedure() 
{ 
    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo")) 
    { 
     var p = new DynamicParameters(); 
     p.Add("@foo", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue); 

     conn.Execute("sp_foo", p, commandType: CommandType.StoredProcedure); 

     var b = p.Get<int>("@foo"); 

     Assert.That(b, Is.EqualTo(99)); 
    } 
} 
+0

Ich habe in meiner gespeicherten Proc und Abfrage Erweiterung ausgewählt. Ich wollte DynamicParameters nicht verwenden, da ich Reflektion verwende, um Parameter zu gespeicherten Procs hinzuzufügen –

1

es eine SqlParameter für Ihre gespeicherte Prozedur mit einem Direction.ReturnValue

Verwandte Themen