Dapper / SQL Server - получить вывод из хранимой процедуры, содержащей операторы вставки и выбора - PullRequest
0 голосов
/ 05 июля 2018

Я только начал изучать Dapper в C #, но у меня возникают трудности с выполнением хранимых процедур с двумя или более операторами SQL в одной транзакции.

Как вы получаете выходной параметр хранимой процедуры, которая содержит операторы Insert и Select в C #, используя Dapper?

Вот моя хранимая процедура:

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.Query? Я также получаю сообщение об ошибке "не могу конвертировать из System.Guid к System.Data.IDbTransaction в моем outputPrimaryKey "

1 Ответ

0 голосов
/ 05 июля 2018

A. Насколько мне известно, в Dapper нет «комбинированного» метода Query and Execute.

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 помощников:

См.

Сравнение QUERY и EXECUTE в Dapper

и

https://github.com/perliedman/dapper-dot-net/blob/master/Dapper%20NET40/SqlMapper.cs

PS ..........

Кажется, у вас есть небольшая ошибка в предложении "output" ..... Вы помещаете имя_файла в таблицу хранения, а не новое значение вновь вставленного 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 */
);
...