【问题标题】:Dapper/SQL Server - get output from Stored Procedure containing Insert and Select statementsDapper/SQL Server - 从包含插入和选择语句的存储过程中获取输出
【发布时间】:2018-12-13 16:25:27
【问题描述】:

我刚开始学习 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 还是 连接。查询?我也收到“无法从 System.Guid 到我的 outputPrimaryKey 中的 System.Data.IDbTransaction"

【问题讨论】:

  • @granadaCoder 是的,这正是我想要做的。我想我可以使用 Execute,因为我的存储过程的 Insert 语句更容易。但是获得输出是我不确定该怎么做的事情。

标签: c# sql sql-server dapper


【解决方案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 */
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多