I use output parameters to get values ββfrom my database.
This is my stored procedure:
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
I'm not sure about the returns at the end:
RETURN (@SubscriptionPIN) RETURN (@SignupDate) RETURN (@ProductCount)
On the other hand, here is the C # code:
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; } } } }
When I run this code, I get an error:
System.InvalidOperationException: String [1]: The Size property has an invalid size of 0.
in System.Data.SqlClient.SqlParameter.Validate (Int32 index, Boolean isCommandProc)
in System.Data.SqlClient.SqlCommand.SetUpRPCParameters (_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters)
in System.Data.SqlClient.SqlCommand.BuildRPC (Boolean inSchema, SqlParameterCollection parameters, _SqlRPC & rpc)
in System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean asynchronous)
in System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, result DbAsyncResult)
in System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult result, String methodName, Boolean sendToPipe)
in System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()
I don't know how to correctly send many output parameters from a stored procedure, can anyone help?