【问题标题】:ExecuteStoreCommand can't return string with SqlParameter outputExecuteStoreCommand 无法返回带有 SqlParameter 输出的字符串
【发布时间】:2016-07-25 09:16:52
【问题描述】:

今天真奇怪。

当我尝试使用 Entity Framework 中的 objectContext 调用 SQL Server 中的存储过程时,使用函数 ExecuteStoreCommand,它总是尝试将“字符串”值转换为“int”。我没有知道为什么。

即使我将输出设置为NvarChar 类型。

我的例外是

将 varchar 值 'text' 转换为 int 数据类型失败

这是我的 C# 代码:

public virtual string GetCardCodeLinkedToAttestation(string atBuisnessCode)
{
    // Input param - String
    SqlParameter atBuisnessCodeParameter = new SqlParameter("atBuisnessCode", atBuisnessCode);

    // The output param - String
    SqlParameter retval = new SqlParameter("retval", SqlDbType.NVarChar,15);
    retval.Direction = ParameterDirection.Output;

    ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("exec @retval = sp_GetCardCodeLinkedToAttestation @atBuisnessCode", atBuisnessCodeParameter, retval);

    return (string)retval.Value;
}

这是我在 SQL Server 中的存储过程(我明确返回 'test' 以确保是一个字符串):

ALTER PROCEDURE [dbo].[sp_GetCardCodeLinkedToAttestation]
    @atBuisnessCode nvarchar(9)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @retval varchar(15);
    set @retval= '';

    -- Insert statements for procedure here
    SET @retval = (SELECT TOP 1 [CardCode] 
                   FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR]  
                   WHERE [U_Attestation] = @atBuisnessCode)

    RETURN 'test';
END
GO

例外:

将 varchar 值 'text' 转换为 int 数据类型失败

我尝试设置值而不返回它,并在我的存储过程中声明输出,但返回的值始终为 NULL。

【问题讨论】:

  • 存储过程的返回类型总是int。如果您想要一个字符串,请使用 output 参数或将其放入结果集中 - 不要使用 return。此外,在命名存储过程时应避免使用 sp_ 作为前缀 - 它是为 Microsoft 的系统过程保留的。

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


【解决方案1】:

这里你需要使用Output,因为return总是返回int数据类型。

默认情况下,存储过程执行成功会返回0

请尝试以下代码:

@atBuisnessCode nvarchar(9),
@retval varchar(15) OUTPUT 
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @retval varchar(15);
    set @retval= '';

    -- Insert statements for procedure here
    set @retval= (SELECT TOP 1 [CardCode] FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR]  WHERE [U_Attestation] = @atBuisnessCode)

    --return 'test';
END
GO

【讨论】:

  • 我正在等待的返回是一个字符串值,例如 (R_123332) 。如我所见,总是返回一个 int 吗?即使我将输出声明为 varchar ?使用您的解决方案,我总是得到返回值 [0]..
  • 如果我设置 @retval = '1234' ,我得到正确的字符串 with1234 。我想他尝试将结果解析为 int。但为什么 ? .没有返回完整字符串值作为输出的解决方案?
  • 你最后是不是用了“return”语句?
  • 您好,感谢您抽出宝贵的时间。不,我完全删除了“返回”。但是现在输出总是等于NULL。我在描述中添加了我的 storeproc 和代码 c# 的新屏幕截图。再次感谢您
  • 它必须是 C# 代码方面的东西,因为您的 SP 看起来不错
【解决方案2】:

我发现,最后我使用 (ExecuteStoreQuery) 而不是 (ExecuteStoreCommand)。我把我的sql直接放在里面。它返回我选择的字符串结果。简单的 。感谢您尝试帮助我 ;-) 。

public virtual string GetCardCodeLinkedToAttestation(string atBuisnessCode)
    {
        string return_value = ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<string>
        (string.Format("SELECT TOP 1 [CardCode] FROM [SC-SAP01].[SWC_PROD].[dbo].[OCPR] WHERE [U_Attestation] = '{0}'", atBuisnessCode)).FirstOrDefault();


        return string.IsNullOrWhiteSpace(return_value) ? string.Empty : return_value;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2015-07-05
    相关资源
    最近更新 更多