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
cmd.Parameters.Add( “@ RETVAL”, “”);应该是这个cmd.Parameters.Add(“@ retval”,SqlDbType.VarChar); –
备注:您应该**不要**为存储过程使用'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_'并将其他内容用作前缀 - 或者根本没有前缀! –