2014-05-19 133 views
0

我从来没有使用过在C#中返回值的存储过程。我试过在网上寻找,我还没有找到任何有用的东西。这可能是因为我真的不明白它是如何工作的。C#存储过程错误返回值

STORED PROCEDURE - dbo.sp_Admin_AddNewUser 

USE [NGE] 
GO 
/****** Object: StoredProcedure [dbo].[sp_Admin_AddNewUser] Script Date: 05/19/2014 15:07:13 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_Admin_AddNewUser] 
(
    @firstname varchar(50), 
    @lastname varchar(50), 
    @middlename  varchar(50), 
    @phone_office varchar(50), 
    @retval varchar(50) OUTPUT 
) 
AS 

INSERT INTO EDUSER 
    (firstname, 
    lastname, 
    middlename, 
    phone_office, 
    synceratorInactiveFlag) 
VALUES(
    rtrim(ltrim(@firstname)), 
    rtrim(ltrim(@lastname)), 
    rtrim(ltrim(@middlename)), 
    rtrim(ltrim(@phone_office)), 
    'A') 

IF @@error = 0 
SELECT @retval = rtrim(ltrim(SCOPE_IDENTITY())) 

--Add the user to the group 
IF EXISTS (SELECT 1 FROM EDGROUP WHERE [group_id] = @GroupID) 
BEGIN 
    INSERT INTO [NGE].[dbo].[EDGROUPPRACTICE] 
    ([group_id] 
    ,[user_id]) 
    VALUES 
    (@GroupID 
    ,@retval) 
END 

代码来调用存储过程:

SqlCommand cmd = new SqlCommand("dbo.sp_Admin_AddNewUser", conn); 
cmd.CommandType = CommandType.StoredProcedure; 
conn.Open(); 

cmd.Parameters.Add(new SqlParameter("@firstname","Test")); 
cmd.Parameters.Add(new SqlParameter("@lastname", "User")); 
cmd.Parameters.Add(new SqlParameter("@middlename", "M")); 
cmd.Parameters.Add(new SqlParameter("@phone_office", "(555) 555-5555")); 

cmd.Parameters.Add("@retval", ""); 
cmd.Parameters["@retval"].Direction = ParameterDirection.ReturnValue; 

cmd.ExecuteNonQuery(); 
tempUserID = (string)cmd.Parameters["@retval"].Value; //GET ERROR HERE 

我得到一个错误:

Procedure or function expects parameter '@retval' which was not supplied

+0

cmd.Parameters.Add( “@ RETVAL”, “”);应该是这个cmd.Parameters.Add(“@ retval”,SqlDbType.VarChar); –

+0

备注:您应该**不要**为存储过程使用'sp_'前缀。微软已经保留了这个前缀以供自己使用(参见*命名存储过程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你将来有可能冒着名字冲突的风险。 [这对你的存储过程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是简单地避免使用'sp_'并将其他内容用作前缀 - 或者根本没有前缀! –

回答

0

它没有返回值,它仅仅是输出参数。使用

cmd.Parameters["@retval"].Direction = ParameterDirection.Output; 

,而不是

cmd.Parameters["@retval"].Direction = ParameterDirection.ReturnValue; 

为了有返回值,你必须在你的SP做

RETURN @retval 

1

尝试添加的参数是这样的:

SqlParameter firstName = cmd.Parameters.Add("@firstname", SqlDbType.VarChar, 50); 
nikParam.Direction = ParameterDirection.Input; 
//Rest of the params 
//Then the output param 
SqlParameter retValOutput = cmd.Parameters.Add("@retval", SqlDbType.VarChar, 50); 
nikParam.Direction = ParameterDirection.Output; 

我希望这有助于;)