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

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

这是我的存储过程:

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]:Size属性的大小无效。
在System.Data.SqlClient.SqlParameter.Validate(Int32 index,Boolean isCommandProc)
在System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc,Int32 startCount,Boolean inSchema,SqlParameterCollection参数)
在System.Data.SqlClient.SqlCommand.BuildRPC(布尔inSchema,SqlParameterCollection参数,_SqlRPC和rpc)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method,DbAsyncResult result)
在System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult结果,String methodName,Boolean sendToPipe)
在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方向的参数来获取返回的值。)

在第一次RETURN“无条件退出查询或过程”后,过程执行结束。

考虑将两个值作为一个记录集返回

 SELECT @SubscriptionPIN AS SubsPIN , @SignupDate AS SignUpDate, @ProductCount AS ProdCount 

在程序结束时。

>尝试将其工作正常用于多输出参数:

 using (SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["conStringEndicia"].ConnectionString)){ using (var sqlCmd = new SqlCommand("endicia.credentialLookup", sqlConnection)) { sqlCmd.CommandType = System.Data.CommandType.StoredProcedure; sqlCmd.Parameters.AddWithValue("@accountNumber", accountNumber); SqlParameter outLogin = new SqlParameter("@login", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output }; sqlCmd.Parameters.Add(outLogin); SqlParameter outPassword = new SqlParameter("@password", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output }; sqlCmd.Parameters.Add(outPassword); sqlConnection.Open(); sqlCmd.ExecuteNonQuery(); string login, password; login = outLogin.Value.ToString(); password = outPassword.Value.ToString(); } } 

这是我尝试过的,它运行正常

 **Stored Procedures** STORED PROCEDURE 1 create procedure spLoginCount @userid nvarchar(50), @password nvarchar(50), @count int out as Begin select @count=count(userid) from users where userid=@userid and pswd=@password End **STORED PROCEDURE 2** create procedure spLoginData @userid nvarchar(50), @usertype nvarchar(20) out, @lastlogin nvarchar(100) out as Begin select @usertype=usertype,@lastlogin=lastlogin from users where userid=@userid End **ASP.NET code which will get values of two output Parameters**.... protected void btnLogin_Click(object sender, EventArgs e) { string uid="", psw=""; uid = txtUserName.Text; psw = txtPassword.Text; string cs = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; using (SqlConnection scon = new SqlConnection(cs)) { SqlCommand scmd = new SqlCommand("spLoginCount", scon); scmd.CommandType = System.Data.CommandType.StoredProcedure; scmd.Parameters.AddWithValue("@userid",uid); scmd.Parameters.AddWithValue("@password", psw); SqlParameter outparameter = new SqlParameter(); outparameter.ParameterName = "@count"; outparameter.SqlDbType = System.Data.SqlDbType.Int; outparameter.Direction = System.Data.ParameterDirection.Output; scmd.Parameters.Add(outparameter); scon.Open(); scmd.ExecuteScalar(); string count = outparameter.Value.ToString(); if (count == "1") { SqlCommand scmd1= new SqlCommand("spLoginData", scon); scmd1.CommandType = System.Data.CommandType.StoredProcedure; scmd1.Parameters.AddWithValue("@userid", uid); /*SqlParameter outUserType = new SqlParameter(); outUserType.ParameterName = "@usertype"; outUserType.SqlDbType = System.Data.SqlDbType.NText; outUserType.Direction = System.Data.ParameterDirection.Output; scmd1.Parameters.Add(outUserType); */ SqlParameter outUserType = new SqlParameter("@usertype", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output }; scmd1.Parameters.Add(outUserType); SqlParameter outLastLogin = new SqlParameter("@lastlogin", SqlDbType.NVarChar, 100) { Direction = ParameterDirection.Output }; scmd1.Parameters.Add(outLastLogin); scmd1.ExecuteNonQuery(); scon.Close(); string usertype,lastlogin; usertype = outUserType.Value.ToString(); lastlogin = outLastLogin.Value.ToString(); } } } 

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

必须给出类型和大小