使用SQL Server 2005中的以下存储过程
IF OBJECT_ID('[dbo].[UserProfile]') IS NOT NULL
DROP PROCEDURE [dbo].[UserProfile]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
CREATE PROCEDURE [dbo].[UserProfile]
(
@UserId VARCHAR(20)
)
AS
IF @UserId = 'userId'
BEGIN
SELECT @UserId = 'Yes'
END
ELSE
SELECT @UserId = 'No'
SELECT @UserId AS RESULT
RETURN RESULT
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
C#代码,需要获取存储过程的结果
public String UserProfile(string userId)
{
String result;
System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();
try
{
cmd.CommandTimeout = this.mCmdTimeout;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UserProfile";
DbParameter p = cmd.CreateParameter();
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Value = userId;
cmd.Parameters.Add(p);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
//Need to assign the value of the stored procedure's return to result
result = Convert.ToString(cmd.Parameters["@UserId"].Value);
}
catch (Exception ex)
{
throw;
}
finally
{
cmd.Connection.Close();
}
return result;
}
如何在C#中返回存储过程的结果?
答案 0 :(得分:7)
我也在寻找Stored过程中的返回值并用C#捕获它。
我根据代码中的逻辑返回了各种返回代码,并且performcalar将无法帮助,因为我想在适当的代码所需的任何地方之间退出存储过程,而不是使用select。 因此,通过添加带有Direction作为ReturnValue的额外参数,您可以捕获返回值。无需OUT参数来捕获存储过程中的返回值。
preturn.ParameterName = "@Return_Value";
preturn.DbType = DbType.Int;
preturn.Direction = ParameterDirection.ReturnValue;
所以这就是我想出来的。编辑本文中的原始代码以保持简单。
public String UserProfile(string userId)
{
String result;
System.Data.Common.DbCommand cmd = this.mConn.CreateCommand();
try
{
cmd.CommandTimeout = this.mCmdTimeout;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "UserProfile";
DbParameter p = cmd.CreateParameter();
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Value = userId;
cmd.Parameters.Add(p);
DbParameter preturn = cmd.CreateParameter();
preturn.ParameterName = "@Return_Value";
preturn.DbType = DbType.Int;
preturn.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(preturn);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
//Need to assign the value of the stored procedure's return to result
result = Convert.ToString(cmd.Parameters["@Return_Value"].Value);
}
catch (Exception ex)
{
throw;
}
finally
{
cmd.Connection.Close();
}
return result;
}
答案 1 :(得分:6)
在这种情况下,您可以使用Command的ExecuteScalar()方法返回值。 ExecuteScalar将查看从数据库返回的第一条记录的第一列。
答案 2 :(得分:4)
在执行命令之前,尝试将其添加到参数的属性中:
cmd.Parameters["@UserId"].Direction = System.Data.ParameterDirection.InputOutput;
**编辑:**
正如Ryan Brunner在评论中所述,您必须在存储过程中将参数标记为OUT才能使其生效。
答案 3 :(得分:3)
您也可以使用输出参数。
在storedprocedure中:
CREATE PROCEDURE [dbo].[UserProfile]
(
@UserId VARCHAR(20) Output
)
在代码中:
p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Direction = System.Data.ParameterDirection.Output;
p.Value = userId;
答案 4 :(得分:1)
您也可以使用输出参数。
答案 5 :(得分:-1)
使用...
Linq2Entities?将sproc拖到设计器中它将是c#中返回正确值的函数。 LINQ2SQL?将sproc拖到设计器中它将是c#中返回正确值的函数。 ADO? - 只需将ExecuteScalar的结果赋值给变量