C# ExecuteStoreCommand无法返回带有SqlParameter输出的字符串
今天真的很奇怪 当我尝试使用实体框架中的objectContext调用SQL Server中的存储过程时,使用函数ExecuteStoreCommand,它总是尝试将“string”值转换为“int”。。我不知道为什么 即使我将输出设置为NvarChar类型 我的例外是 将varchar值“text”转换为int数据类型失败 这是我的C代码: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) {
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看起来很好