มีวิธีเรียกขั้นตอนที่เก็บไว้กับ Dapper หรือไม่


205

ฉันประทับใจมากกับผลลัพธ์ของDapper Micro ORMสำหรับ stackoverflow.com ฉันกำลังพิจารณามันสำหรับโครงการใหม่ของฉันและฉันมีข้อกังวลอย่างหนึ่งเกี่ยวกับว่าบางครั้งโครงการของฉันต้องมีขั้นตอนการจัดเก็บและฉันมีการค้นหาจำนวนมากบนเว็บ แต่ไม่พบอะไรที่มีขั้นตอนการจัดเก็บ ดังนั้นจะมีวิธีใดที่ Dapper จะทำงานกับโพรซีเดอร์ที่เก็บไว้?

โปรดแจ้งให้เราทราบหากเป็นไปได้ถ้าไม่อย่างนั้นฉันต้องขยายออกไป


ดูรายละเอียดคำตอบของฉันได้ที่นี่stackoverflow.com/questions/5957774/…
Majedur Rahaman

คำตอบ:


356

ในกรณีง่าย ๆ ที่คุณสามารถทำได้:

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 ในชุด แต่นั่นเป็น clunky เพิ่มเติม


1
พารามิเตอร์ที่มีทิศทางของ ReturnValue ควรกำหนดไว้ก่อนใช่ไหม
จบ Tjahjono

3
@ Sam Saffron ความแตกต่างระหว่าง. Output และ. ReturnVlaue คืออะไร
สิ้นสุด

แซมสิ่งนี้อนุญาตชุดผลลัพธ์จาก SPROC หรือไม่
แบรด

2
ฉันได้รับสถานการณ์ที่ฉันจะใช้ชุดผลลัพธ์แบบสอบถามและค่าพารามิเตอร์เอาต์พุตในกระบวนการ หากฉันใช้cnn.Query<MyType>ฉันจะรับค่าพารามิเตอร์ Output ของ proc ได้อย่างไร
Murali Murugesan

วิธีแก้ปัญหาที่สอง (แฟนซี) ยังมีประโยชน์เมื่อคุณต้องการส่งผ่านค่า Null สำหรับพารามิเตอร์กระบวนงานที่เก็บไว้อย่างน้อยหนึ่งรายการ
Ricardo Sanchez

13

ฉันคิดว่าคำตอบนั้นขึ้นอยู่กับคุณสมบัติของขั้นตอนการจัดเก็บที่คุณต้องใช้

วิธีการจัดเก็บกลับชุดผลลัพธ์สามารถทำงานโดยใช้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

17
เพิ่งเพิ่มการสนับสนุนสำหรับพารามิเตอร์ขาออกตอนนี้ดูการเช็คอินล่าสุดของฉัน
Sam Saffron

6
@ Sam - นั่นคือสิ่งที่ฉันเรียกบริการ!
Ed Harper

6

นี่คือรหัสสำหรับรับค่าตอบแทนจากขั้นตอนการจัดเก็บ

ขั้นตอนการเก็บ:

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

2

เหมือนกันจากด้านบนเล็กน้อยรายละเอียดเพิ่มเติม

ใช้. 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;

ทำไมต้องใช้Microsoft.EntityFrameworkCore? ใช้DapperในDAL เท่านั้นหรือ
PreguntonCojoneroCabrón

@ PreguntonCojoneroCabrónไม่จำเป็นฉันเพิ่งวางทุกอย่าง
Arun Prasad ES

แถวตัวอย่างสำหรับประเภทเหตุการณ์?
Kiquenet

@ArunPrasadES ถึงจุดPreguntonCojoneroCabrónโปรดล้างและลบรหัสที่ไม่จำเป็นออกไปเพราะมันทำให้ผู้คนสับสนในการพยายามแก้ปัญหา มีคุณสมบัติใน Visual Studio และ Resharper ที่ใช้วิธีนี้ในการล้างข้อมูลให้คุณ
เล็ก ๆ จ๊อกกี้

1

ด้วยผลตอบแทนหลายและหลายพารามิเตอร์

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 ตัวอย่าง ? ส่งคืน 2 เคอร์เซอร์หรือไม่
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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.