Apakah ada cara untuk memanggil prosedur tersimpan dengan Dapper?


205

Saya sangat terkesan dengan hasil Dapper Micro ORM untuk stackoverflow.com. Saya sedang mempertimbangkan untuk proyek baru saya dan tetapi saya memiliki satu kekhawatiran tentang itu beberapa kali proyek saya mengharuskan untuk memiliki Prosedur Tersimpan dan saya telah mencari banyak di web tetapi tidak menemukan apa pun dengan prosedur tersimpan. Jadi apakah ada cara agar Dapper bekerja dengan prosedur tersimpan?

Tolong beri tahu saya jika mungkin jika tidak saya harus memperpanjang dengan cara saya.


Lihat perincian saya, jawab di sini stackoverflow.com/questions/5957774/…
Majedur Rahaman

Jawaban:


356

Dalam kasus sederhana yang dapat Anda lakukan:

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

Jika Anda menginginkan sesuatu yang lebih mewah, Anda dapat melakukan:

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

Selain itu Anda dapat menggunakan exec dalam batch, tetapi itu lebih kikuk.


1
Parameter dengan arah ReturnValue harus didefinisikan terlebih dahulu, bukan?
Endy Tjahjono

3
@ Sam Saffron Apa perbedaan antara .Output dan .ReturnVlaue?
Abadi

Sam, apakah ini mengizinkan set hasil dari SPROC?
Brad

2
Saya mendapat skenario di mana saya akan mengambil set hasil kueri dan nilai parameter Output dalam suatu prosedur. Jika saya menggunakan, cnn.Query<MyType>bagaimana saya bisa mendapatkan nilai parameter Output dari proc?
Murali Murugesan

Solusi kedua (mewah) juga membantu ketika Anda harus memberikan nilai nol untuk satu atau lebih parameter prosedur tersimpan.
Ricardo Sanchez

13

Saya pikir jawabannya tergantung pada fitur mana dari prosedur tersimpan yang perlu Anda gunakan.

Prosedur tersimpan mengembalikan set hasil dapat dijalankan menggunakan Query; prosedur tersimpan yang tidak mengembalikan set hasil dapat dijalankan menggunakan Execute- dalam kedua kasus (menggunakan EXEC <procname>) sebagai perintah SQL (ditambah parameter input yang diperlukan). Lihat dokumentasi untuk lebih jelasnya.

Pada revisi 2d128ccdc9a2 tampaknya tidak ada dukungan asli untuk OUTPUTparameter; Anda bisa menambahkan ini, atau sebagai alternatif membangun Queryperintah yang lebih kompleks yang mendeklarasikan variabel TSQL, mengeksekusi OUTPUTparameter pengumpulan SP ke dalam variabel lokal dan akhirnya mengembalikannya dalam set hasil:

DECLARE @output int

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

SELECT @output AS output1

17
baru saja menambahkan dukungan untuk params keluaran sekarang, lihat lapor masuk terbaru
Sam Saffron

6
@ Sam - itulah yang saya sebut layanan!
Ed Harper

6

Berikut adalah kode untuk mendapatkan pengembalian nilai dari prosedur Store

Prosedur tersimpan:

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 

Kode:

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

Sama dari atas, sedikit lebih detail

Menggunakan .Net Core

Pengendali

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

Prosedur Tersimpan (hubungan orangtua anak)

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

Referensi dalam kasus

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;

Kenapa menggunakan Microsoft.EntityFrameworkCore? Hanya menggunakan Dapper di DAL ?
PreguntonCojoneroCabrón

@ PreguntonCojoneroCabrón Tidak perlu, saya hanya menempelkan semuanya
Arun Prasad ES

Baris sampel untuk EventCategory?
Kiquenet

@ArunPrasadES ke titik PreguntonCojoneroCabrón, harap bersihkan dan hapus kode yang tidak perlu karena membingungkan orang yang mencoba memecahkan masalah. Ada beberapa fitur dalam Visual Studio dan Resharper yang melakukan pembersihan penggunaan ini untuk Anda.
Cubicle.Jockey

1

Dengan multiple return dan multi parameter

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

Sampel ProductSearch ? mengembalikan 2 kursor?
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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.