Есть ли способ вызвать хранимую процедуру с помощью Dapper?
Я очень впечатлен результатами Dapper Micro ORM для stackru.com. Я рассматриваю это для своего нового проекта, но у меня есть одно беспокойство по поводу того, что мой проект иногда требует наличия хранимой процедуры, и я много искал в Интернете, но ничего не нашел с помощью хранимой процедуры. Так есть ли способ заставить Dapper работать с хранимой процедурой?
Пожалуйста, дайте мне знать, если это возможно, в противном случае я должен расширить его на моем пути.
7 ответов
В простом случае вы можете сделать:
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 в пакете, но это более неуклюже.
Я думаю, что ответ зависит от того, какие функции хранимых процедур вам нужно использовать.
Хранимые процедуры, возвращающие набор результатов, можно запустить с помощью 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
Вот код для получения значения возврата из процедуры Store
Хранимая процедура:
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");
С многократным возвратом и несколькими параметрами
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;
}
То же самое сверху, немного более подробно
Использование.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;
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("GetPagePicturesById", new { PageId = pageId, LangId = languageId, PictureTypeId = pictureTypeId }).ToList();
Вот код хранимой процедуры с параметрами
var procedureName = "ShowCompanyForProvidedEmployeeId";
var parameters = new DynamicParameters();
parameters.Add("Id", id, DbType.Int32, ParameterDirection.Input);
using (var connection = _context.CreateConnection())
{
var company = await connection.QueryFirstOrDefaultAsync<CompanyModel>
(procedureName, parameters, commandType: CommandType.StoredProcedure);
return company;
}