Có cách nào để gọi một thủ tục được lưu trữ với Dapper không?


205

Tôi rất ấn tượng với kết quả của Dapper Micro ORM cho stackoverflow.com. Tôi đang xem xét nó cho dự án mới của mình và tôi có một lo ngại về việc đôi khi dự án của tôi yêu cầu phải có Thủ tục lưu trữ và tôi đã tìm kiếm rất nhiều trên web nhưng không tìm thấy gì với thủ tục được lưu trữ. Vậy có cách nào để Dapper hoạt động với một thủ tục được lưu trữ không?

Xin vui lòng cho tôi biết nếu có thể nếu không tôi phải mở rộng nó theo cách của tôi.


Xem chi tiết của tôi trả lời ở đây stackoverflow.com/questions/5957774/ từ
Majedur Rahaman

Câu trả lời:


356

Trong trường hợp đơn giản, bạn có thể làm:

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

Nếu bạn muốn một cái gì đó lạ mắt hơn, bạn có thể làm:

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

Ngoài ra, bạn có thể sử dụng exec trong một đợt, nhưng điều đó là khó khăn hơn.


1
Tham số với hướng của ReturnValue nên được xác định trước, phải không?
Endy Tjahjono

3
@Sam Saffron Sự khác biệt giữa .Output và .ReturnVlaue là gì?
Vô tận

Sam, điều này có cho phép tập kết quả từ XUÂN không?
Brad

2
Tôi có một kịch bản trong đó tôi sẽ lấy tập kết quả truy vấn và giá trị tham số đầu ra trong một thủ tục. Nếu tôi sử dụng, cnn.Query<MyType>làm thế nào tôi có thể nhận được giá trị của tham số đầu ra của Proc?
Murali Murugesan

Giải pháp thứ hai (ưa thích) cũng hữu ích khi bạn cần truyền giá trị null cho một hoặc nhiều tham số thủ tục được lưu trữ.
Ricardo Sanchez

13

Tôi nghĩ rằng câu trả lời phụ thuộc vào các tính năng của các thủ tục được lưu trữ mà bạn cần sử dụng.

Các thủ tục được lưu trữ trả về một tập kết quả có thể được chạy bằng cách sử dụng Query; các thủ tục được lưu trữ không trả về tập kết quả có thể được chạy bằng cách sử dụng Execute- trong cả hai trường hợp (sử dụng EXEC <procname>) làm lệnh SQL (cộng với các tham số đầu vào nếu cần). Xem tài liệu để biết thêm chi tiết.

Kể từ phiên bản 2d128ccdc9a2, dường như không có hỗ trợ riêng cho OUTPUTcác tham số; bạn có thể thêm cái này hoặc xây dựng một Querylệnh phức tạp hơn để khai báo các biến TSQL, đã thực thi các OUTPUTtham số thu thập SP vào các biến cục bộ và cuối cùng đã chuyển chúng trong một tập kết quả:

DECLARE @output int

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

SELECT @output AS output1

17
chỉ cần thêm hỗ trợ cho các thông số đầu ra ngay bây giờ, hãy xem đăng ký mới nhất của tôi
Sam Saffron

6
@Sam - đó là những gì tôi gọi dịch vụ!
Ed Harper

6

Đây là mã để nhận được giá trị trả về từ thủ tục Store

Thủ tục lưu trữ:

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 

Mã số:

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

2

Tương tự từ trên, chi tiết hơn một chút

Sử dụng .Net Core

Bộ điều khiển

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

Thủ tục lưu trữ (quan hệ cha mẹ con)

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

Tài liệu tham khảo trong trường hợp

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;

Tại sao nên sử dụng Microsoft.EntityFrameworkCore? Chỉ sử dụng Dapper trong DAL ?
PreguntonCojoneroCabrón

@ PreguntonCojoneroCabrón Không cần thiết, tôi chỉ cần dán mọi thứ
Arun Prasad ES

Các hàng mẫu cho EventC Category?
Kiquenet

@ArunPrasadES đến điểm PreguntonCojoneroCabrón, vui lòng dọn dẹp và xóa mã không cần thiết vì nó gây nhầm lẫn cho mọi người khi cố gắng giải quyết vấn đề. Có các tính năng trong Visual Studio và Resharper thực hiện việc này giúp bạn dọn dẹp.
Cubicle.J Racer

1

Với nhiều thông số trả về và đa tham số

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

ProductSearch mẫu ? Trả về 2 con trỏ?
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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.