我需要在应用程序中从存储过程返回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");
我尝试了很多但没有运气。请指教。
答案 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
这应该可以满足您的需求。如果这是正确的方法?不确定。但它确实很有效并且很容易;)