2009-10-28 119 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