Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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# ExecuteStoreCommand无法返回带有SqlParameter输出的字符串_C#_Sql Server_Entity Framework_Stored Procedures - Fatal编程技术网

C# ExecuteStoreCommand无法返回带有SqlParameter输出的字符串

C# ExecuteStoreCommand无法返回带有SqlParameter输出的字符串,c#,sql-server,entity-framework,stored-procedures,C#,Sql Server,Entity Framework,Stored Procedures,今天真的很奇怪 当我尝试使用实体框架中的objectContext调用SQL Server中的存储过程时,使用函数ExecuteStoreCommand,它总是尝试将“string”值转换为“int”。。我不知道为什么 即使我将输出设置为NvarChar类型 我的例外是 将varchar值“text”转换为int数据类型失败 这是我的C代码: public virtual string GetCardCodeLinkedToAttestation(string atBuisnessCode) {

今天真的很奇怪

当我尝试使用实体框架中的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数据类型失败

我试图在不返回值的情况下设置该值,并在存储过程中声明输出,但返回的值始终为NULL


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

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

我发现,最后我使用了ExecuteStoreQuery而不是ExecuteStoreCommand。我将sql直接放入其中。它将返回select的字符串结果。容易的谢谢你试着帮助我;-

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;
    }

我发现,最后我使用了ExecuteStoreQuery而不是ExecuteStoreCommand。我将sql直接放入其中。它将返回select的字符串结果。容易的谢谢你试着帮助我;-

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;
    }

存储过程的返回类型始终为int。如果需要字符串,请使用输出参数或将其放置在结果集中-不要使用返回。此外,在命名存储过程时,应避免使用sp_uu作为前缀-它是为Microsoft的系统过程保留的。存储过程的返回类型始终为int。如果需要字符串,请使用输出参数或将其放置在结果集中-不要使用返回。此外,在命名存储过程时,应避免使用sp_u作为前缀-它是为Microsoft的系统过程保留的。我等待的返回值是一个类似R_123332的字符串值。如我所见,总是返回int吗?即使我将输出声明为varchar?。对于您的解决方案,我总是得到返回值[0]…如果我设置@retval='1234',我将正确地得到一个带有1234的字符串。我想他试着把结果解析为int,但为什么呢。没有将完整字符串值作为输出返回的解决方案?您是否在结尾使用return语句?您好,谢谢您抽出时间给我。不,我完全删除了“返回”。但是现在输出总是等于NULL。我在描述中添加了我的storeproc和代码c的新屏幕截图。谢谢,againit必须是C代码端的东西,因为您的SP看起来很好。我正在等待的返回值是一个类似R_123332的字符串值。如我所见,总是返回int吗?即使我将输出声明为varchar?。对于您的解决方案,我总是得到返回值[0]…如果我设置@retval='1234',我将正确地得到一个带有1234的字符串。我想他试着把结果解析为int,但为什么呢。没有将完整字符串值作为输出返回的解决方案?您是否在结尾使用return语句?您好,谢谢您抽出时间给我。不,我完全删除了“返回”。但是现在输出总是等于NULL。我在描述中添加了我的storeproc和代码c的新屏幕截图。谢谢,againit必须是C代码端的东西,因为您的SP看起来很好