Gibt es eine Möglichkeit, eine gespeicherte Prozedur mit Dapper aufzurufen?

205

Ich bin sehr beeindruckt von den Ergebnissen von Dapper Micro ORM für stackoverflow.com. Ich überlege es mir für mein neues Projekt, aber ich habe ein Problem damit, dass mein Projekt manchmal eine gespeicherte Prozedur erfordert und ich viel im Web gesucht habe, aber nichts mit gespeicherter Prozedur gefunden habe. Gibt es also eine Möglichkeit, Dapper mit einer gespeicherten Prozedur arbeiten zu lassen?

Bitte lassen Sie mich wissen, ob es möglich ist, sonst muss ich es auf meine Weise erweitern.

Jalpesh Vadgama
quelle
Siehe meine Details Antwort hier stackoverflow.com/questions/5957774/…
Majedur Rahaman

Antworten:

356

Im einfachen Fall können Sie Folgendes tun:

var user = cnn.Query<User>("spGetUser", new {Id = 1}, 
        commandType: CommandType.StoredProcedure).First();

Wenn Sie etwas ausgefalleneres wollen, können Sie Folgendes tun:

 var p = new DynamicParameters();
 p.Add("@a", 11);
 p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
 p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

 cnn.Execute("spMagicProc", p, commandType: CommandType.StoredProcedure); 

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

Zusätzlich können Sie exec in einem Stapel verwenden, aber das ist klobiger.

Sam Safran
quelle
1
Der Parameter mit der Richtung von ReturnValue sollte zuerst definiert werden, oder?
Endy Tjahjono
3
@ Sam Saffron Was ist der Unterschied zwischen .Output und .ReturnVlaue?
Zeitlos
Sam, erlaubt dies Ergebnismengen von SPROCs?
Brad
2
Ich habe ein Szenario, in dem ich die Abfrageergebnismenge und den Ausgabeparameterwert in einer Prozedur übernehmen werde. Wenn ich verwende, cnn.Query<MyType>wie kann ich den Wert des Ausgabeparameters des Prozesses erhalten?
Murali Murugesan
Die zweite (ausgefallene) Lösung ist auch hilfreich, wenn Sie einen Nullwert für einen oder mehrere gespeicherte Prozedurparameter übergeben müssen.
Ricardo Sanchez
13

Ich denke, die Antwort hängt davon ab, welche Funktionen gespeicherter Prozeduren Sie verwenden müssen.

Gespeicherte Prozeduren, die eine Ergebnismenge zurückgeben, können mit ausgeführt werden Query. Gespeicherte Prozeduren, die keine Ergebnismenge zurückgeben, können mit Execute- in beiden Fällen (mit EXEC <procname>) als SQL-Befehl (plus erforderlichen Eingabeparametern) ausgeführt werden. Weitere Informationen finden Sie in der Dokumentation .

Ab Revision 2d128ccdc9a2 scheint es keine native Unterstützung für OUTPUTParameter zu geben. Sie können dies hinzufügen oder alternativ einen komplexeren QueryBefehl erstellen, der TSQL-Variablen deklariert, die SP-Erfassungsparameter OUTPUTin den lokalen Variablen ausführt und sie schließlich in einer Ergebnismenge zurückgibt:

DECLARE @output int

EXEC <some stored proc> @i = @output OUTPUT

SELECT @output AS output1
Ed Harper
quelle
17
Ich habe gerade Unterstützung für Ausgabeparameter hinzugefügt, siehe mein letztes Einchecken
Sam Saffron
6
@ Sam - das nenne ich Service!
Ed Harper
6

Hier ist der Code zum Abrufen der Wertrückgabe aus der Store-Prozedur

Gespeicherte Prozedur:

alter proc [dbo].[UserlogincheckMVC]    
@username nvarchar(max),    
@password nvarchar(max)
as    
begin    
    if exists(select Username from Adminlogin where Username =@username and Password=@password)    
        begin        
            return 1  
        end    
    else    
        begin     
            return 0  
        end    
end 

Code:

var parameters = new DynamicParameters();
string pass = EncrytDecry.Encrypt(objUL.Password);
conx.Open();
parameters.Add("@username", objUL.Username);
parameters.Add("@password", pass);
parameters.Add("@RESULT", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
var RS = conx.Execute("UserlogincheckMVC", parameters, null, null, commandType: CommandType.StoredProcedure);
int result = parameters.Get<int>("@RESULT");
Saineshwar
quelle
2

Gleich von oben, etwas detaillierter

Verwenden von .Net Core

Regler

public class TestController : Controller
{
    private string connectionString;

    public IDbConnection Connection
    {
        get { return new SqlConnection(connectionString); }
    }

    public TestController()
    {
        connectionString = @"Data Source=OCIUZWORKSPC;Initial Catalog=SocialStoriesDB;Integrated Security=True";
    }

    public JsonResult GetEventCategory(string q)
    {
        using (IDbConnection dbConnection = Connection)
        {
            var categories = dbConnection.Query<ResultTokenInput>("GetEventCategories", new { keyword = q },
    commandType: CommandType.StoredProcedure).FirstOrDefault();

            return Json(categories);
        }
    }

    public class ResultTokenInput
    {
        public int ID { get; set; }
        public string name { get; set; }            
    }
}

Gespeicherte Prozedur (Eltern-Kind-Beziehung)

create PROCEDURE GetEventCategories
@keyword as nvarchar(100)
AS
    BEGIN

    WITH CTE(Id, Name, IdHierarchy,parentId) AS
    (
      SELECT 
        e.EventCategoryID as Id, cast(e.Title as varchar(max)) as Name,
        cast(cast(e.EventCategoryID as char(5)) as varchar(max)) IdHierarchy,ParentID
      FROM 
        EventCategory e  where e.Title like '%'+@keyword+'%'
     -- WHERE 
      --  parentid = @parentid

      UNION ALL

      SELECT 
        p.EventCategoryID as Id, cast(p.Title + '>>' + c.name as varchar(max)) as Name,
        c.IdHierarchy + cast(p.EventCategoryID as char(5)),p.ParentID
      FROM 
        EventCategory p 
      JOIN  CTE c ON c.Id = p.parentid

        where p.Title like '%'+@keyword+'%'
    )
    SELECT 
      * 
    FROM 
      CTE
    ORDER BY 
      IdHierarchy

Referenzen für den Fall

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using SocialStoriesCore.Data;
using Microsoft.EntityFrameworkCore;
using Dapper;
using System.Data;
using System.Data.SqlClient;
Arun Prasad ES
quelle
Warum mit Microsoft.EntityFrameworkCore? Nur Dapper in DAL verwenden ?
PreguntonCojoneroCabrón
@ PreguntonCojoneroCabrón Nicht notwendig, ich habe gerade alles eingefügt
Arun Prasad ES
Beispielzeilen für EventCategory?
Kiquenet
@ArunPrasadES bis PreguntonCojoneroCabrón Punkt, bitte bereinigen und entfernen Sie unnötigen Code, da dies die Leute verwirrt, die versuchen, ein Problem zu lösen. In Visual Studio und Resharper gibt es Funktionen, mit denen die Bereinigung für Sie verwendet wird.
Cubicle.Jockey
1

Mit mehrfacher Rückgabe und mehreren Parametern

string ConnectionString = CommonFunctions.GetConnectionString();
using (IDbConnection conn = new SqlConnection(ConnectionString))
{
    IEnumerable<dynamic> results = conn.Query(sql: "ProductSearch", 
        param: new { CategoryID = 1, SubCategoryID="", PageNumber=1 }, 
        commandType: CommandType.StoredProcedure);.  // single result

    var reader = conn.QueryMultiple("ProductSearch", 
        param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, 
        commandType: CommandType.StoredProcedure); // multiple result

    var userdetails = reader.Read<dynamic>().ToList(); // instead of dynamic, you can use your objects
    var salarydetails = reader.Read<dynamic>().ToList();
}

public static string GetConnectionString()
{
    // Put the name the Sqlconnection from WebConfig..
    return ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
}
Arun Prasad ES
quelle
ProductSearch- Beispiel ? gibt 2 Cursor zurück?
PreguntonCojoneroCabrón
0
public static IEnumerable<T> ExecuteProcedure<T>(this SqlConnection connection,
    string storedProcedure, object parameters = null,
    int commandTimeout = 180) 
    {
        try
        {
            if (connection.State != ConnectionState.Open)
            {
                connection.Close();
                connection.Open();
            }

            if (parameters != null)
            {
                return connection.Query<T>(storedProcedure, parameters,
                    commandType: CommandType.StoredProcedure, commandTimeout: commandTimeout);
            }
            else
            {
                return connection.Query<T>(storedProcedure,
                    commandType: CommandType.StoredProcedure, commandTimeout: commandTimeout);
            }
        }
        catch (Exception ex)
        {
            connection.Close();
            throw ex;
        }
        finally
        {
            connection.Close();
        }

    }
}

var data = db.Connect.ExecuteProcedure<PictureModel>("GetPagePicturesById",
    new
    {
        PageId = pageId,
        LangId = languageId,
        PictureTypeId = pictureTypeId
    }).ToList();
Hakan YILMAZ
quelle