ExecuteStoreCommand不能返回带有SqlParameter输出

时间:2016-07-25 09:16:53

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

今天真的很奇怪。

当我尝试使用函数框架中的objectContext在SQL Server中调用存储过程时,使用函数ExecuteStoreCommand,它总是尝试将'string'值转换为'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数据类型

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:2)

这里需要使用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

答案 1 :(得分:0)

我发现,最后我使用(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;
    }