Dapper / SQL Server-从包含Insert和Select语句的存储过程中获取输出

时间:2018-07-05 08:50:19

标签: c# sql sql-server dapper

我刚刚开始用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“

1 个答案:

答案 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 */
);