C# Dapper/SQL Server-从包含Insert和Select语句的存储过程中获取输出
我刚开始学习C语言中的Dapper,但在一个事务中使用两个或多个SQL语句执行存储过程时遇到了困难 如何获取存储过程的输出参数 包含C中使用Dapper的Insert和Select语句 以下是我的存储过程:C# Dapper/SQL Server-从包含Insert和Select语句的存储过程中获取输出,c#,sql,sql-server,dapper,C#,Sql,Sql Server,Dapper,我刚开始学习C语言中的Dapper,但在一个事务中使用两个或多个SQL语句执行存储过程时遇到了困难 如何获取存储过程的输出参数 包含C中使用Dapper的Insert和Select语句 以下是我的存储过程: ALTER PROCEDURE [dbo].[AddToFileDetailsAndGetPrimaryKey] -- 1. declare input variables @file_name NVARCHAR(100) = NULL, -- 2. declare output va
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);
}
下面是我用来执行存储过程的代码:
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.Data.IDbTransaction的System.Guid
答:据我所知,Dapper没有查询和执行组合方法 但是,由于您的存储过程是一个带有输入和输出参数的黑盒,您可以尝试以下方法:下面是未测试的伪代码
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");
发件人:
存储过程
一般而言:
衣冠楚楚是专为速度而设计的
还有。Dapper的功能有限:
从
Dapper是一个单独的文件,您可以将其放入您的项目中
扩展IDbConnection接口
它提供3个助手:
看
及
PS
您的输出子句中似乎有一个小错误。。。。。
您正在将文件名推入保留表,而不是新插入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 */
);
@格拉纳达编码是的,这正是我想要做的。我想我可以使用Execute,因为它更容易使用存储过程的Insert语句。但我不确定如何才能获得输出。