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

时间:2013-12-06 06:34:46

标签: c# sql-server stored-procedures

我需要在应用程序中从存储过程返回2个值。以下是我的应用程序中的代码段。我需要获得SureveyID&的值。各个insert语句后面的InputID。

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

AddParameter& 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");

我尝试了很多但没有运气。请指教。

3 个答案:

答案 0 :(得分:3)

在SqlCommand的Parameters集合中找到输出参数的值...比如

mySqlCommand.Parameters["@SurveyID"].Value

执行后

mySqlCommand.ExecuteNonQuery();

答案 1 :(得分:1)

保留你的输出参数的变量,然后检查.Value。输出被写入参数,但由于装箱,它不会被写入你的int。基本上,你的int被复制到参数中,原始变量不会改变。

答案 2 :(得分:1)

ExecuteNonQuery返回受影响的行数,而不是其他任何行。

我从未在我的存储过程中使用输出参数。我通常做的是选择我想要返回的值。

所以在你这样做之后:

SET @SurveyID = SCOPE_IDENTITY()
SET @InputID = SCOPE_IDENTITY()

我会这样做

select @SurveyID as SurveyID,@InputID as InputID

当然,我会在存储过程中声明这些变量而不是OUTPUT

这应该可以满足您的需求。如果这是正确的方法?不确定。但它确实很有效并且很容易;)