从C#中的存储过程返回多个值
本文关键字:返回 存储过程 | 更新日期: 2024-07-27 12:52:30
我需要从应用程序中的存储过程返回2个值。下面是我的应用程序中的代码片段。我需要得到SurveyID&在相应的插入语句之后的下面输入ID。
int surveyId = 0;
int inputId = 0;
SqlDataManager manager = new SqlDataManager();
manager.AddParameter("@Name", surveyInstance.SurveyName);
manager.AddParameter("@Type", surveyInstance.SurveyType);
manager.AddParameter("@UserId", surveyInstance.UserId);
manager.AddParameter("@InputType", surveyInstance.InputType);
manager.AddParameter("@DisplayName", surveyInstance.DisplayName);
manager.AddOutputParameter("@SurveyID",System.Data.DbType.Int32,surveyId);
manager.AddOutputParameter("@InputID", System.Data.DbType.Int32,inputId);
manager.ExecuteNonQuery("pr_CreateSurvey");
添加参数&AddOutputParameter是如下所示的自定义方法
public void AddParameter(string parameterName, DbType parameterType, object parameterValue)
{
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = parameterName;
parameter.DbType = parameterType;
parameter.Value = parameterValue;
parameters.Add(parameter);
}
public void AddOutputParameter(string parameterName, DbType parameterType, object parameterValue)
{
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = parameterName;
parameter.DbType = parameterType;
parameter.Value = parameterValue;
parameter.Direction = ParameterDirection.Output;
parameters.Add(parameter);
}
以下是存储过程的代码片段
ALTER PROCEDURE [dbo].[pr_CreateSurvey]
-- Add the parameters for the stored procedure here
@Name varchar(50),@Type varchar(50),@UserId varchar(50),@InputType varchar(50),@DisplayName varchar(50),
@SurveyID int OUTPUT,@InputID int OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Insert into surveys(name,user_id,display_name,type) values(@Name,@UserId,@DisplayName,@Type)
SET @SurveyID = SCOPE_IDENTITY()
Insert into input_types(name) values (@InputType)
SET @InputID = SCOPE_IDENTITY()
END
insert语句运行良好,但我的应用程序中没有返回任何值。它是0。我尝试使用下面的语句返回1个值(SurveyID),但仍然没有得到正确的值。每次都是-1。
surveyId = manager.ExecuteNonQuery("pr_CreateSurvey");
我尝试了很多,但没有成功。请告知。
在SqlCommand的parameters集合中查找输出参数的值。。。像
mySqlCommand.Parameters["@SurveyID"].Value
在你执行之后
mySqlCommand.ExecuteNonQuery();
保留一个输出参数的变量,然后检查.Value。ouput被写入参数,但由于装箱,它不会被写入int。基本上,int被复制到参数中,原始变量不会改变。
ExecuteNonQuery返回受影响的行数,而不是其他任何值。
我从未在存储过程中为此使用过输出参数。我通常会选择要返回的值。
所以在你这样做之后:
SET @SurveyID = SCOPE_IDENTITY()
SET @InputID = SCOPE_IDENTITY()
我会做这个
select @SurveyID as SurveyID,@InputID as InputID
当然,我会在存储过程中声明这些变量,而不是OUTPUT
这应该会给你想要的。如果这是正确的方式?不确定。但它确实很管用,而且很容易;)