Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dapper/SQL Server-从包含Insert和Select语句的存储过程中获取输出_C#_Sql_Sql Server_Dapper - Fatal编程技术网

C# Dapper/SQL Server-从包含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

我刚开始学习C语言中的Dapper,但在一个事务中使用两个或多个SQL语句执行存储过程时遇到了困难

如何获取存储过程的输出参数 包含C中使用Dapper的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);
}
下面是我用来执行存储过程的代码:

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语句。但我不确定如何才能获得输出。