Czy istnieje sposób na wywołanie procedury składowanej za pomocą Dappera?

205

Jestem pod wielkim wrażeniem wyników Dapper Micro ORM dla stackoverflow.com. Zastanawiam się nad tym w moim nowym projekcie, ale mam obawy, że czasami mój projekt wymaga procedury składowanej i często szukałem w Internecie, ale nic nie znalazłem w procedurze przechowywanej. Czy jest więc jakiś sposób, aby Dapper pracował z procedurą przechowywaną?

Daj mi znać, jeśli to możliwe, w przeciwnym razie muszę go przedłużyć.

Jalpesh Vadgama
źródło
Zobacz moje szczegóły, odpowiedz tutaj stackoverflow.com/questions/5957774/...
Majedur Rahaman

Odpowiedzi:

356

W prostym przypadku możesz wykonać:

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

Jeśli chcesz czegoś bardziej wyszukanego, możesz:

 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"); 

Dodatkowo możesz użyć exec w partii, ale jest to bardziej niezręczne.

Sam Saffron
źródło
1
Najpierw należy zdefiniować parametr z kierunkiem ReturnValue, prawda?
Endy Tjahjono
3
@Sam Saffron Jaka jest różnica między .Output a .ReturnVlaue?
Ponadczasowy,
Sam, czy to pozwala na zestawy wyników z SPROC?
Brad
2
Mam scenariusz, w którym wezmę zestaw wyników zapytania i wartość parametru Output w procedurze. Jeśli użyję, cnn.Query<MyType>jak mogę uzyskać wartość parametru Wyjściowego proc?
Murali Murugesan
Drugie (fantazyjne) rozwiązanie jest również pomocne, gdy trzeba przekazać wartość zerową dla jednego lub więcej parametrów procedury składowanej.
Ricardo Sanchez
13

Myślę, że odpowiedź zależy od funkcji procedur przechowywanych, których należy użyć.

Procedury składowane zwracające zestaw wyników można uruchomić za pomocą Query; procedury składowane, które nie zwracają zestawu wyników, można uruchomić przy użyciu Execute- w obu przypadkach (przy użyciu EXEC <procname>) jako polecenia SQL (plus parametry wejściowe w razie potrzeby). Więcej informacji znajduje się w dokumentacji .

Od wersji 2d128ccdc9a2 nie ma natywnej obsługi OUTPUTparametrów; możesz to dodać lub alternatywnie skonstruować bardziej złożone Querypolecenie, które zadeklarowało zmienne TSQL, wykonało SP zbierając OUTPUTparametry do zmiennych lokalnych i ostatecznie zwróciło je w zestawie wyników:

DECLARE @output int

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

SELECT @output AS output1
Ed Harper
źródło
17
właśnie dodałem obsługę parametrów wyjściowych teraz, zobacz moje ostatnie logowanie
Sam Saffron,
6
@Sam - to nazywam serwisem!
Ed Harper
6

Oto kod do uzyskania zwrotu wartości z procedury Store

Procedura składowana:

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 

Kod:

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
źródło
2

To samo z góry, nieco bardziej szczegółowe

Korzystanie z .Net Core

Kontroler

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

Procedura składowana (relacja rodzic-dziecko)

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

Referencje w sprawie

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
źródło
Dlaczego przy użyciu Microsoft.EntityFrameworkCore? Używasz tylko Dappera w DAL ?
PreguntonCojoneroCabrón
@ PreguntonCojoneroCabrón Nie jest konieczne, po prostu wkleiłem wszystko
Arun Prasad ES
Przykładowe wiersze dla EventCategory?
Kiquenet,
@ArunPrasadES do punktu PreguntonCojoneroCabrón, proszę wyczyścić i usunąć niepotrzebny kod, ponieważ dezorientuje ludzi próbujących rozwiązać problem. Istnieją funkcje Visual Studio i Resharper, które wykonują to czyszczenie dla Ciebie.
Cubicle.Jockey
1

Z wielokrotnym powrotem i wieloma parametrami

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
źródło
Wyszukiwarka produktĂłw próbka ? zwraca 2 kursory?
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
źródło