从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");

我尝试了很多,但没有成功。请告知。

从C#中的存储过程返回多个值

在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

这应该会给你想要的。如果这是正确的方式?不确定。但它确实很管用,而且很容易;)