这是我的存储过程:
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 OUTPUTASBEGIN -- 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,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",100) { Direction = ParameterDirection.Output };cmd.Parameters.Add(SignupDate);
从存储过程中删除return语句.您无需为返回的输出参数执行任何 *** 作. (另外,您只能使用一个return语句,并且只能返回整数值.您可以使用带有ReturnValue方向的参数来获取返回的值.)
总结以上是内存溢出为你收集整理的如何从C#函数的存储过程返回多个输出参数全部内容,希望文章能够帮你解决如何从C#函数的存储过程返回多个输出参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)