Есть ли способ вызвать хранимую процедуру с помощью Dapper?

Я очень впечатлен результатами Dapper Micro ORM для stackoverflow.com. Я рассматриваю это для своего нового проекта, но у меня есть одна забота о том, что несколько раз мой проект требует наличия хранимой процедуры, и я много искал в Интернете, но ничего не нашел в хранимой процедуре. Итак, есть ли способ заставить Dapper работать с хранимой процедурой?

Пожалуйста, дайте мне знать, если это возможно, в противном случае я должен продлить его на моем пути.

Ответы

Ответ 1

Я просто проверил в богатой поддержке procs:

В простом случае вы можете сделать:

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

Если вам нужно что-то более необычное, вы можете сделать:

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

Кроме того, вы можете использовать exec в пакете, но это более неуклюже.

Ответ 2

Я думаю, что ответ зависит от того, какие функции хранимых процедур вам нужно использовать.

Сохраненные процедуры, возвращающие набор результатов, могут быть запущены с помощью Query; хранимые процедуры, которые не возвращают результирующий набор, могут выполняться с использованием Execute - в обоих случаях (с использованием EXEC <procname>) в качестве команды SQL (при необходимости, плюс входные параметры). Подробнее см. .

С точки зрения версии 2d128ccdc9a2 не существует встроенной поддержки параметров OUTPUT; вы можете добавить это или, альтернативно, построить более сложную команду Query, которая объявила переменные TSQL, выполнила параметры сбора SP OUTPUT в локальные переменные и, наконец, вернула их в результирующий набор:

DECLARE @output int

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

SELECT @output AS output1

Ответ 3

Вот код для возврата значения из процедуры Store

Сохраненная процедура:

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

код:

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

Ответ 4

То же самое сверху, бит более подробный

Использование .Net Core

контроллер

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

Сохраненная процедура (отношение родительского дочернего элемента)

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 '%'[email protected]+'%'
     -- 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 '%'[email protected]+'%'
    )
    SELECT 
      * 
    FROM 
      CTE
    ORDER BY 
      IdHierarchy

Ссылки в случае

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;

Ответ 5

С множественным возвратом и несколькими параметрами

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