有没有办法用Dapper调用存储过程?

Jal*_*ama 196 .net orm stored-procedures dapper

对于stackoverflow.com 的Dapper Micro ORM的结果我印象非常深刻.我正在考虑我的新项目,但我有一个担心,有时我的项目需要有存储过程,我在网上搜索了很多但没有找到存储过程的任何东西.那么有没有办法让Dapper使用存储过程?

如果可能,请告诉我,否则我必须以我的方式延长它.

Sam*_*ron 343

在简单的情况下,你可以这样做:

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

如果你想要更有趣的东西,你可以这样做:

 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"); 
Run Code Online (Sandbox Code Playgroud)

另外,你可以批量使用exec,但这更笨重.

  • @Sam Saffron .Output和.ReturnVlaue有什么区别? (3认同)
  • 我有一个场景,我将在过程中获取查询结果集和输出参数值.如果我使用`cnn.Query <MyType>`我怎样才能获得proc的Output参数值? (2认同)

Ed *_*per 12

我认为答案取决于您需要使用哪些存储过程的功能.

返回结果集的存储过程可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 刚刚添加了对输出参数的支持,请参阅我的最新签到 (17认同)
  • @Sam - 这就是我所说的服务! (6认同)

Sai*_*war 6

这是从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 
Run Code Online (Sandbox Code Playgroud)

码:

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");
Run Code Online (Sandbox Code Playgroud)