Есть ли способ вызвать хранимую процедуру с помощью Dapper?
Я очень впечатлен результатами Dapper Micro ORM для stackoverflow.com. я рассматриваю его для своего нового проекта, но у меня есть одна забота о том, что несколько раз мой проект требует наличия хранимой процедуры, и я много искал в интернете, но ничего не нашел с хранимой процедурой. Итак, есть ли способ заставить Dapper работать с хранимой процедурой?
пожалуйста, дайте мне знать, если это возможно в противном случае я должен продлить его в моем пути.
6 ответов:
в простом случае вы можете сделать:
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, выполнила сбор SPOUTPUT
параметры в локальные переменные и, наконец, вернули их в результирующий набор:DECLARE @output int EXEC <some stored proc> @i = @output OUTPUT SELECT @output AS output1
вот код для получения значения return from Store procedure
хранимая процедура:
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");
то же самое сверху, немного более подробно
Использование .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;
с множественным возвратом и несколькими параметрами
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; }
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.Соединять.ExecuteProcedure ("GetPagePicturesById", новый { PageId = pageId, LangId = languageId, PictureTypeId = pictureTypeId }).ToList ();