我刚刚开始用C#学习Dapper,但是在一个事务中执行带有两个或多个SQL语句的存储过程时遇到了困难。
如何获取存储过程的输出参数, 使用Dapper包含C#中的Insert和Select语句吗?
这是我的存储过程:
ALTER PROCEDURE [dbo].[AddToFileDetailsAndGetPrimaryKey]
-- 1. declare input variables
@file_name NVARCHAR(100) = NULL,
-- 2. declare output variable
@file_details_pk UNIQUEIDENTIFIER OUTPUT
AS
-- 3. instantiate holder table
DECLARE @pk_holder TABLE
(
retrieved_pk UNIQUEIDENTIFIER
)
-- 4. insert into FileDetails
INSERT INTO dbo.FileDetails
(
file_name
)
OUTPUT INSERTED.file_details_pk INTO @pk_holder
VALUES
(
@file_name
);
-- 5. set FileDetails primary key to OUTPUT variable
SELECT @file_details_pk = retrieved_pk
FROM @pk_holder
这是我用来执行存储过程的代码:
using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Configuration.GetConnectionString("TESTDB")))
{
List<FileDetails> fileList = new List<FileDetails>();
fileList.Add(new FileDetails { file_name = fileName});
Guid outputPrimaryKey;
connection.Execute("dbo.AddToFileDetailsAndGetPrimaryKey @file_name, @file_details_pk", fileList, outputPrimaryKey);
}
这是正确的方法吗?我应该使用connection.Execute还是 连接。查询?我也收到错误消息“无法从 我的outputPrimaryKey中的System.Guid到System.Data.IDbTransaction“
答案 0 :(得分:1)
A。据我所知,Dapper没有“查询并执行”“组合”方法。
B。但是,由于您的存储过程是一个带有输入和输出参数的黑匣子,因此您可以尝试以下操作:(下面的伪代码,未经测试)
var p = new DynamicParameters();
p.Add("@file_name", "fileOne");
p.Add("@file_details_pk", dbType: DbType.Guid, direction: ParameterDirection.Output);
cnn.Execute("dbo.AddToFileDetailsAndGetPrimaryKey", p, commandType: CommandType.StoredProcedure);
Guid b = p.Get<Guid>("@file_details_pk");
发件人:
https://github.com/perliedman/dapper-dot-net
(“存储过程”)
通常:
Dapper旨在提高速度。
也。 Dapper功能有限:
来自
https://github.com/perliedman/dapper-dot-net
Dapper是一个文件,您可以将其放入项目 扩展您的IDbConnection接口。
它提供了 3 助手:
请参见
Comparing QUERY and EXECUTE in Dapper
和
https://github.com/perliedman/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs
PS ..........
您的“输出”子句中似乎有一个小错误。 您正在将file_name推入保存表,而不是新插入的PK的新值。
-- 4. insert into FileDetails
INSERT INTO dbo.FileDetails
(
file_name
)
OUTPUT INSERTED.file_details_pk INTO @pk_holder
VALUES
(
@file_name /* << this looks wrong */
);