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

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

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


person Jalpesh Vadgama    schedule 11.05.2011    source источник
comment
См. Мои подробные ответы здесь stackoverflow .com / questions / 5957774 /   -  person Majedur    schedule 13.01.2019


Ответы (5)


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

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 в пакетном режиме, но это более неуклюже.

person Sam Saffron    schedule 11.05.2011
comment
Параметр с направлением ReturnValue должен быть определен первым, верно? - person Endy Tjahjono; 24.01.2014
comment
@Sam Saffron В чем разница между .Output и .ReturnVlaue? - person Timeless; 14.07.2014
comment
Сэм, это позволяет получить наборы результатов из SPROC? - person Brad; 16.01.2015
comment
У меня есть сценарий, в котором я буду использовать набор результатов запроса и значение параметра вывода в процедуре. Если я использую cnn.Query<MyType>, как я могу получить значение параметра вывода процедуры? - person Murali Murugesan; 15.03.2015
comment
Второе (необычное) решение также полезно, когда вам нужно передать нулевое значение для одного или нескольких параметров хранимой процедуры. - person Ricardo Sanchez; 05.05.2016
comment
Execute возвращает тип int. Так что, если вам нужно получить результат SP, это не сработает. - person Siyavash Hamdi; 24.04.2017
comment
Есть ли способ передать объект класса в качестве параметра и передать свойства класса dapper map соответствующему параметру хранимой процедуры. На самом деле у меня есть одна хранимая процедура, которая принимает 30 параметров, и я не хочу создавать этот длинный динамический объект. - person Mahesh More; 07.02.2019

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

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

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

DECLARE @output int

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

SELECT @output AS output1
person Ed Harper    schedule 11.05.2011
comment
только что добавлена ​​поддержка параметров вывода, см. мою последнюю проверку - person Sam Saffron; 11.05.2011
comment
@Sam - это то, что я называю службой! - person Ed Harper; 11.05.2011

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

Хранимая процедура:

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 

Код:

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");
person Saineshwar    schedule 31.08.2014

То же, что и выше, немного подробнее

Использование .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 '%'+@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

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

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;
person Arun Prasad E S    schedule 03.02.2017
comment
Зачем использовать Microsoft.EntityFrameworkCore? Используете только Dapper в DAL? - person PreguntonCojoneroCabrón; 05.09.2017
comment
@ PreguntonCojoneroCabrón Не обязательно, я просто все наклеил - person Arun Prasad E S; 05.09.2017
comment
Примеры строк для EventCategory? - person Kiquenet; 05.07.2019
comment
@ArunPrasadES к пункту PreguntonCojoneroCabrón, пожалуйста, очистите и удалите ненужный код, поскольку он сбивает с толку людей, пытающихся решить проблему. В Visual Studio и Resharper есть функции, которые делают эту очистку использования за вас. - person Cubicle.Jockey; 09.07.2019

С многократным возвратом и многопараметрическим

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;
}
person Arun Prasad E S    schedule 10.04.2017
comment
ProductSearch образец? возвращает 2 курсора? - person PreguntonCojoneroCabrón; 06.09.2017