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