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 sollteALTER 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
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
https://stackoverflow.com/questions/14247081/return-values-from-dapper-net-query-with-stored-procedure – SteveJ
@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 ;-) –