【问题标题】:Out parameter with ExecuteSqlCommandAsync带 ExecuteSqlCommandAsync 的输出参数
【发布时间】:2019-09-17 13:59:57
【问题描述】:

我正在使用 Entity Framework 的 ExecuteSqlCommandAsync 命令调用存储过程。这会引发错误消息:

过程或函数“LoadChargeCarrierOnForklift”需要参数 '@ID_Storage',未提供。

我的代码如下:

SqlParameter outIdStorageParam = new SqlParameter("@ID_Storage", SqlDbType.Int) {
    Direction = ParameterDirection.Output
};

try {
    await Database.ExecuteSqlCommandAsync(
        "exec dbo.LoadChargeCarrierOnForklift @ID_Carrier, @ForkliftName, @User",
        new SqlParameter("@ID_Carrier", id_Carrier),
        new SqlParameter("@ForkliftName", forkliftName),
        new SqlParameter("@User", user),
        outIdStorageParam
    );
} catch (System.Exception ex) {
    var a = ex;
    throw;
}

return (int)outIdStorageParam.Value;

以下 SQL 命令有效:

USE [MyDB]
GO

DECLARE @return_value int,
        @ID_Storage int

EXEC    @return_value = [dbo].[LoadChargeCarrierOnForklift]
        @ID_Carrier = 1,
        @ForkliftName = N'ABC',
        @User = N'DEF',
        @ID_Storage = @ID_Storage OUTPUT

SELECT  @ID_Storage as N'@ID_Storage'

SELECT  'Return Value' = @return_value

GO

我对 C# 代码中的参数做错了什么?

【问题讨论】:

标签: c# sql sql-server entity-framework


【解决方案1】:

这个:

await Database.ExecuteSqlCommandAsync(
    "exec dbo.LoadChargeCarrierOnForklift @ID_Carrier, @ForkliftName, @User",
    new SqlParameter("@ID_Carrier", id_Carrier),
    new SqlParameter("@ForkliftName", forkliftName),
    new SqlParameter("@User", user),
    outIdStorageParam

按位置绑定参数,省略 ID_Storage 的参数。等价的

EXEC    @return_value = [dbo].[LoadChargeCarrierOnForklift]
        @ID_Carrier = 1,
        @ForkliftName = N'ABC',
        @User = N'DEF',
        @ID_Storage = @ID_Storage OUTPUT

按名称绑定参数,并包含两个输出参数,将是

    SqlParameter outIdStorageParam = new SqlParameter("@ID_Storage", SqlDbType.Int) {
        Direction = ParameterDirection.Output};
    SqlParameter outReturnValue = new SqlParameter("@return_value", SqlDbType.Int) {
        Direction = ParameterDirection.Output };

    await Database.ExecuteSqlCommandAsync(
        @"EXEC @return_value = [dbo].[LoadChargeCarrierOnForklift]
            @ID_Carrier = @ID_Carrier,
            @ForkliftName = @ForkliftName,
            @User = @User,
            @ID_Storage = @ID_Storage OUTPUT",
        outReturnValue 
        new SqlParameter("@ID_Carrier", id_Carrier),
        new SqlParameter("@ForkliftName", forkliftName),
        new SqlParameter("@User", user),
        outIdStorageParam);

【讨论】:

  • 非常感谢。将@ID_Storage = @ID_Storage OUTPUT 添加到参数列表后,它工作正常。你能教我,为什么我需要做这个奇怪的@Param = @Param 事情吗?我知道,它有效,但我不明白为什么它是必要的。
  • 这就是按名称绑定参数的方式。 = 的左侧是形参名称,右侧是包含您要传递的值的参数。您可以为两者使用相同的名称,这总是看起来很奇怪。如果您想改为按位置绑定参数,则可以,只需省略 @param = 部分并确保您以正确的顺序获取参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多