Dapper ile saklı bir yordamı çağırmanın bir yolu var mı?


207

Stackoverflow.com için Dapper Micro ORM sonuçlarından çok etkilendim . Yeni projem için bunu düşünüyorum ve ancak projemin bazı zamanlarda Saklı Yordam olmasını gerektirdiği konusunda bir endişem var ve web'de çok fazla arama yaptım, ancak saklı yordamla hiçbir şey bulamadım. Dapper'ın saklı bir yordamla çalışmasının herhangi bir yolu var mı?

Lütfen mümkünse bana bildirin, aksi takdirde onu uzatmam gerekiyor.


Detaylarımı burada bulabilirsiniz. Stackoverflow.com/questions/5957774/…
Majedur Rahaman

Yanıtlar:


358

Basit durumda şunları yapabilirsiniz:

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

Daha süslü bir şey istiyorsanız, şunları yapabilirsiniz:

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

Ayrıca exec bir toplu iş kullanabilirsiniz, ancak bu daha karmaşık.


1
Önce ReturnValue yönüne sahip parametre tanımlanmalıdır, değil mi?
Endy Tjahjono

3
@Sam Saffron .Output ve .ReturnVlaue arasındaki fark nedir?
Zamansız

Sam, bu SPROC'lerden sonuç kümelerine izin veriyor mu?
Brad

2
Bir yordamda sorgu sonuç kümesi ve Çıktı parametresi değerini alacağım bir senaryo var. Eğer kullanırsam cnn.Query<MyType>, proc'un Output parametresinin değerini nasıl alabilirim?
Murali Murugesan

İkinci (fantezi) çözüm, bir veya daha fazla saklı yordam parametresi için boş bir değer iletmeniz gerektiğinde de yararlıdır.
Ricardo Sanchez

13

Yanıtın, saklı yordamların hangi özelliklerini kullanmanız gerektiğine bağlı olduğunu düşünüyorum.

Sonuç kümesini döndüren saklı yordamlar Query; sonuç kümesi döndürmeyen saklı yordamlar , SQL komutu olarak Executeher iki durumda da (kullanılarak EXEC <procname>) ve ayrıca gerektiğinde giriş parametreleri kullanılarak çalıştırılabilir. Daha fazla ayrıntı için belgelere bakın.

2d128ccdc9a2 revizyonundan itibarenOUTPUT parametreler için yerel destek görünmemektedir ; bunu ekleyebilir veya alternatif olarak QueryTSQL değişkenlerini bildiren, SP toplama OUTPUTparametrelerini yerel değişkenlere uygulayan ve sonunda bir sonuç kümesinde geri döndüren daha karmaşık bir komut oluşturabilirsiniz :

DECLARE @output int

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

SELECT @output AS output1

17
şimdi çıkış parametreleri için destek ekledi, bkz. en son iade
Sam Saffron

6
@Sam - buna servis diyorum!
Ed Harper

6

Mağaza prosedüründen değer getirisi almak için kod

Saklı yordam:

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 

Kod:

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

Yukarıdan aynı, biraz daha ayrıntılı

Net Core'u kullanma

kontrolör

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

Saklı Yordam (ebeveyn-alt ilişkisi)

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

Durumda referanslar

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;

Neden kullanıyorsunuz Microsoft.EntityFrameworkCore? Sadece kullanarak Dapper içinde DAL ?
PreguntonCojoneroCabrón

@ PreguntonCojoneroCabrón Gerekli değil, sadece her şeyi yapıştırdım
Arun Prasad ES

EventCategory için örnek satırlar?
Kiquenet

@ArunPrasadES - PreguntonCojoneroCabrón noktası, lütfen bir sorunu çözmeye çalışan insanları karıştırdığı için gereksiz kodu temizleyin ve kaldırın. Visual Studio ve Resharper'da bu kullanımı sizin için temizleyen özellikler vardır.
Cubicle.Jockey

1

Çoklu dönüş ve çoklu parametre ile

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

Ürün Arama örneği ? 2 imleç döndürür?
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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.