我对stackoverflow.com的Dapper Micro ORM的结果印象深刻。我正在考虑它为我的新项目,但我有一个担心,有时我的项目需要有存储过程,我在网上搜索了很多,但没有发现任何与存储过程。那么,有没有办法让Dapper使用存储过程呢?
请让我知道是否可能,否则我必须以我的方式扩展它。
我对stackoverflow.com的Dapper Micro ORM的结果印象深刻。我正在考虑它为我的新项目,但我有一个担心,有时我的项目需要有存储过程,我在网上搜索了很多,但没有发现任何与存储过程。那么,有没有办法让Dapper使用存储过程呢?
请让我知道是否可能,否则我必须以我的方式扩展它。
当前回答
我认为答案取决于您需要使用存储过程的哪些特性。
返回结果集的存储过程可以使用Query;不返回结果集的存储过程可以使用Execute -在这两种情况下(使用EXEC <procname>)作为SQL命令(根据需要加上输入参数)。有关详细信息,请参阅文档。
从版本2d128ccdc9a2开始,似乎不支持OUTPUT参数;你可以添加这个,或者构造一个更复杂的查询命令,声明TSQL变量,执行SP收集输出参数到局部变量中,并最终在结果集中返回它们:
DECLARE @output int
EXEC <some stored proc> @i = @output OUTPUT
SELECT @output AS output1
其他回答
下面是从存储过程中获取返回值的代码
存储过程:
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");
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();
在简单的情况下,你可以这样做:
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,但这比较笨拙。
具有多返回、多参数功能
string ConnectionString = CommonFunctions.GetConnectionString();
using (IDbConnection conn = new SqlConnection(ConnectionString))
{
// single result
var results = conn.Query(sql: "ProductSearch",
param: new { CategoryID = 1, SubCategoryID="", PageNumber=1 },
commandType: CommandType.StoredProcedure);
var salarydetails = reader.Read<dynamic>().ToList();
// multiple result
var reader = conn.QueryMultiple("ProductSearch",
param: new { CategoryID = 1, SubCategoryID = "", PageNumber = 1 },
commandType: CommandType.StoredProcedure);
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;
}
我认为答案取决于您需要使用存储过程的哪些特性。
返回结果集的存储过程可以使用Query;不返回结果集的存储过程可以使用Execute -在这两种情况下(使用EXEC <procname>)作为SQL命令(根据需要加上输入参数)。有关详细信息,请参阅文档。
从版本2d128ccdc9a2开始,似乎不支持OUTPUT参数;你可以添加这个,或者构造一个更复杂的查询命令,声明TSQL变量,执行SP收集输出参数到局部变量中,并最终在结果集中返回它们:
DECLARE @output int
EXEC <some stored proc> @i = @output OUTPUT
SELECT @output AS output1