update stored query .net stored-procedures orm dapper

.net - stored - ¿Hay alguna manera de llamar a un procedimiento almacenado con Dapper?



insert dapper c# (5)

Estoy muy impresionado con los resultados de Dapper Micro ORM para stackoverflow.com. Lo estoy considerando para mi nuevo proyecto y tengo una preocupación acerca de que algunas veces mi proyecto requiere tener un procedimiento almacenado y he buscado mucho en la web pero no encontré nada con el procedimiento almacenado. Entonces, ¿hay alguna forma de que Dapper trabaje con un procedimiento almacenado?

Por favor, avíseme si es posible, de lo contrario tendré que extenderlo en mi camino.


Aquí hay un código para obtener el valor devuelto por el procedimiento de almacenamiento

Procedimiento almacenado:

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

Código:

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


Con retorno múltiple y multi parámetro

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


Creo que la respuesta depende de las características de los procedimientos almacenados que necesita usar.

Los procedimientos almacenados que devuelven un conjunto de resultados se pueden ejecutar utilizando Query ; los procedimientos almacenados que no devuelven un conjunto de resultados se pueden ejecutar utilizando Execute , en ambos casos (utilizando EXEC <procname> ) como el comando SQL (más los parámetros de entrada según sea necesario). Ver la documentation para más detalles.

A partir de la revisión 2d128ccdc9a2 , no parece haber soporte nativo para los parámetros OUTPUT ; podría agregar esto o, alternativamente, construir un comando Query más complejo que declarara variables TSQL, ejecutara el SP recolectando los parámetros OUTPUT en las variables locales y finalmente los devolvió en un conjunto de resultados:

DECLARE @output int EXEC <some stored proc> @i = @output OUTPUT SELECT @output AS output1


En el caso simple puedes hacer:

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

Si quieres algo más elegante, puedes hacer:

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

Además, puede usar el ejecutor en un lote, pero eso es más torpe.


Lo mismo desde arriba, un poco más detallado

Usando .Net Core

Controlador

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

Procedimiento almacenado (relación padre / hijo)

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

Referencias en el caso

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;