क्या डैपर के साथ संग्रहीत प्रक्रिया को कॉल करने का एक तरीका है?


205

मैं stackoverflow.com के लिए Dapper माइक्रो ORM के परिणामों से बहुत प्रभावित हूँ । मैं इसे अपनी नई परियोजना के लिए विचार कर रहा हूं, लेकिन मुझे इस बात की चिंता है कि कुछ समय के लिए मेरी परियोजना में संग्रहीत प्रक्रिया की आवश्यकता है और मैंने वेब पर बहुत खोज की है, लेकिन संग्रहीत प्रक्रिया के साथ कुछ भी नहीं मिला है। तो क्या डैपर के पास संग्रहीत कार्यविधि के साथ काम करने का कोई तरीका है?

कृपया मुझे बताएं कि क्या यह संभव है अन्यथा मुझे इसे अपने तरीके से आगे बढ़ाना होगा।


देखें मेरी जानकारी यहां का जवाब stackoverflow.com/questions/5957774/...
Majedur रहमान

जवाबों:


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

इसके अतिरिक्त आप एक बैच में निष्पादन का उपयोग कर सकते हैं, लेकिन यह अधिक क्लंकी है।


1
रिटर्नवैल्यू की दिशा वाले पैरामीटर को पहले, सही परिभाषित किया जाना चाहिए?
एंडी तजहोनो

3
@ सॅम केसर .ऑटपुत और .RurnurnVlaue में क्या अंतर है?
टाइमलेस

सैम, क्या यह SPROCs से परिणाम सेट की अनुमति देता है?
ब्रैड

2
मुझे एक परिदृश्य मिला जहां मैं एक परिणाम में क्वेरी परिणाम सेट और आउटपुट पैरामीटर मान ले रहा हूं। यदि मैं उपयोग cnn.Query<MyType>करता हूं तो मुझे खरीद के आउटपुट पैरामीटर का मूल्य कैसे मिल सकता है?
मुरली मुरुगेसन

दूसरा (फैंसी) समाधान तब भी मददगार होता है जब आपको एक या एक से अधिक संग्रहित प्रक्रिया मापदंडों के लिए एक शून्य मान पास करने की आवश्यकता होती है।
रिकार्डो सांचेज़

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
आउटपुट पैरामेट्स के लिए अभी जोड़ा समर्थन, मेरे नवीनतम चेकइन देखें
सैम केसर

6
@Sam - यही मैं सेवा कहता हूँ!
एड हार्पर

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 कोर का उपयोग करना

नियंत्रक

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? केवल DAL में Dapper का उपयोग ?
प्रीग्टनटनकोजेनो कैब्रॉन

@ प्रेगनटनकोंजेरो कैब्रोन जरूरी नहीं, मैंने बस सब कुछ चिपकाया
अरुण प्रसाद ES

EventCategory के लिए नमूना पंक्तियाँ?
किनिकेत जूल 5'19

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

उत्पाद खोज नमूना ? 2 अभिशाप देता है?
प्रीग्टनटनकोजेरो कैब्रोन

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.