有没有办法用Dapper调用存储过程?
Dapper Micro ORM的结果给我留下了非常深刻的印象。 我正在考虑为我的新项目,但我有一个担心,有些时候我的项目需要有存储过程,我有很多在网上search,但没有发现任何存储过程。 那么有没有什么办法让Dapper能够使用存储过程呢?
请让我知道如果有可能,否则我必须按照我的方式扩展它。
我刚刚检查了对procs的丰富支持:
在简单的情况下,你可以做:
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,但是更笨重。
我认为答案取决于您需要使用哪些存储过程的function。
存储过程返回结果集可以运行使用Query
; 不返回结果集的存储过程可以使用Execute
– 在两种情况下(使用EXEC <procname>
)作为SQL命令(必要时加上input参数)运行。 请参阅文档了解更多详情。
从修订版2d128ccdc9a2开始 ,对于OUTPUT
参数来说 ,似乎不是本地支持; 你可以添加这个,或者构build一个更复杂的Query
命令,声明TSQLvariables,执行SP收集OUTPUT
参数到本地variables,并最终返回结果集中:
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");
同样从上面,更详细一点
使用.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;
具有多个返回和多参数
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); var reader = conn.QueryMultiple("ProductSearch", param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 }, commandType: CommandType.StoredProcedure); var userdetails = reader.Read<dynamic>().ToList(); var salarydetails = reader.Read<dynamic>().ToList(); } public static string GetConnectionString() { // Put the name the Sqlconnection from WebConfig.. return ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; }