2009-10-28 77 views
2

随着下面的存储过程在SQL Server 2005中从C#中的存储过程,需要一个返回值

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#中返回我的存储过程的结果?

回答

6

在这种情况下,你可以使用ExecuteScalar司令部()方法返回的值。 ExecuteScalar将查看从数据库返回的第一条记录的第一列。

+0

简单的东西,这就是我一直在寻找。你也必须转换为你想要的类型,在这种情况下它是一个字符串。 – 2009-10-28 14:55:04

+0

是的,这是迄今为止最简单的答案。 – 2009-10-28 14:58:12

+0

此方法不适用于具有返回值而不是返回的输出值或行的存储过程。有关返回值,请参阅user_v的答案。 – Josh 2015-04-30 15:59:16

-1

使用...?

Linq2Entities?将sproc拖入设计器,它将成为c#中的函数,返回正确的值。 Linq2Sql?将sproc拖入设计器,它将成为c#中的函数,返回正确的值。 ADO? - 刚刚的ExecuteScalar结果赋值给一个变量

+0

@Russell,这就是标签的用途,他们明确声明他正在使用SQL C#及其SQL中的一个sproc。 – JonH 2009-10-28 14:40:39

+0

JonH - 这些都是在C#中用SQL来完成的有效方法。 – 2009-10-28 14:43:39

1

你可能也有使用的输出参数。

4

尝试执行命令前加上这对参数的属性:

​​

**编辑:**
瑞安布伦纳在注释中规定,您必须在存储过程作为OUT标记您的参数这工作。

+0

为了达到此目的,@UserID也需要在存储过程中标记为输出参数。 – 2009-10-28 14:45:11

+0

啊,是的,你说得对。 @Chris Ballance,如果你采取这种方法,请听赖恩的建议!我将编辑。 – 2009-10-28 14:52:04

+0

+1为你的帖子和社区让你的帖子更好 – 2009-10-28 14:54:25

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; 
+0

这将涉及到更改存储过程本身,使用System.Data.ParameterDirection.ReturnValue的方向向命令添加一个参数是所有你需要做的捕获返回来自存储过程的值。 – 2016-12-21 07:06:18

7

我也一直在寻找从存储过程返回值和捕捉它在C#。

我返回基于逻辑的各种返回码在我的代码,并会的ExecuteScalar没有帮助,因为我想在任何地方用适当的规范要求,而不是使用select返回之间进行存储过程的。 所以通过添加一个额外的参数并将其作为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; 
} 
+0

请注意,参数名称是任意的,关键因素是方向是ReturnValue。对于具有ReturnValue方向的命令,您只能有一个参数。还要注意,参数名称与为此命令声明的任何现有参数不匹配。 – 2016-12-21 07:03:18