gpt4 book ai didi

c# - 如何从 C# 函数的存储过程返回多个输出参数

转载 作者:太空狗 更新时间:2023-10-29 20:24:50 25 4
gpt4 key购买 nike

我正在使用输出参数从我的数据库中获取值。

这是我的存储过程:

ALTER PROCEDURE [dbo].[sp_GetCustomerMainData] 
-- Add the parameters for the stored procedure here
@Reference nvarchar(100),
@SubscriptionPIN nvarchar(100) OUTPUT,
@SignupDate nvarchar(100) OUTPUT,
@ProductCount int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

SET @SubscriptionPIN = 'N/A'
SET @SignupDate = 'N/A'
SET @ProductCount = 0

-- Insert statements for procedure here
IF EXISTS(SELECT [SubscriptionPIN] FROM [Norton].[dbo].[Customers] WHERE [Reference] = @Reference)
BEGIN
SELECT TOP 1 @SubscriptionPIN = [SubscriptionPIN], @SignupDate = SignUpDate FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference
SET @ProductCount = (SELECT COUNT(*) FROM [Norton].[dbo].[ProductList] WHERE [Reference] = @Reference)
END

RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)
END

我不确定最后的返回:

RETURN (@SubscriptionPIN)
RETURN (@SignupDate)
RETURN (@ProductCount)

另一方面,这是 C# 代码:

using (SqlConnection con = new SqlConnection(connectionInfo))
{
using (SqlCommand cmd = new SqlCommand("sp_GetCustomerMainData", con) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.Add("@Reference", SqlDbType.NVarChar).Value = CustomerReferenceID;

SqlParameter SubscriptionPIN = new SqlParameter("@TheCustomerID", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SubscriptionPIN);

SqlParameter SignupDate = new SqlParameter("@SignupDate", SqlDbType.NVarChar) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SignupDate);

SqlParameter ProductCount = new SqlParameter("@ProductCount", SqlDbType.Int) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(ProductCount);

con.Open();

try
{
cmd.ExecuteNonQuery();

if (cmd.Parameters["@TheCustomerID"].Value.ToString() != "N/A")
{
aStatus.SubscriptionPIN = cmd.Parameters["@TheCustomerID"].Value.ToString();
aStatus.SignupDate = cmd.Parameters["@SignupDate"].Value.ToString();
aStatus.ProductCount = int.Parse(cmd.Parameters["@ProductCount"].Value.ToString());
aStatus.Result = "0: Reference ID Found";
}
else
{
aStatus.Result = "1: Reference ID does not exists";
return aStatus;
}
}
catch (SqlException sqlExc)
{
foreach (SqlError error in sqlExc.Errors)
{
aStatus.Result = string.Format("{0}: {1}", error.Number, error.Message);
return aStatus;
}
}
}
}

当我运行这段代码时,出现错误:

System.InvalidOperationException: String[1]: the Size property has an invalid size of 0.
at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc)
at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters)
at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

我不知道从存储过程发送许多输出参数的正确方法是什么,有人可以帮忙吗?

最佳答案

您需要为 nvarchar 参数指定最大长度:

SqlParameter SubscriptionPIN = new SqlParameter("@TheCustomerID", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SubscriptionPIN);
SqlParameter SignupDate = new SqlParameter("@SignupDate", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output };
cmd.Parameters.Add(SignupDate);

从存储过程中删除 return 语句。您无需为返回的输出参数执行任何操作。 (此外,您只能使用一个 return 语句,并且只能返回整数值。您可以使用方向为 ReturnValue 的参数来获取返回值。)

关于c# - 如何从 C# 函数的存储过程返回多个输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12884461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com