Нужно вернуть значение из хранимой процедуры в C # - PullRequest
2 голосов
/ 28 октября 2009

Со следующей хранимой процедурой в 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 #?

Ответы [ 6 ]

7 голосов
/ 30 сентября 2011

Я также искал возвращаемое значение из хранимой процедуры и захватывал его в C #.

Я возвращал различные коды возврата, основанные на логике в моем коде, и executetescalar не поможет, так как я хотел вернуться из сохраненного процесса между тем, где это требуется, с соответствующим кодом и не использовать 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;  
}  
6 голосов
/ 28 октября 2009

В этом случае вы можете использовать метод ExecuteScalar () Command, чтобы вернуть значение. ExecuteScalar будет смотреть на первый столбец первой записи, возвращенной из базы данных.

4 голосов
/ 28 октября 2009

Попробуйте добавить это в свойства параметра перед выполнением команды:

cmd.Parameters["@UserId"].Direction = System.Data.ParameterDirection.InputOutput;

** Редактировать: **
Как отметил Райан Бруннер в комментариях, вы должны пометить ваш параметр как OUT в хранимой процедуре, чтобы это работало.

3 голосов
/ 28 октября 2009

Вы также можете использовать параметр Output.

В хранимой процедуре:

CREATE PROCEDURE [dbo].[UserProfile] 
(      
      @UserId VARCHAR(20) Output
)

В коде:

p.ParameterName = "@UserId";
p.DbType = DbType.String;
p.Direction = System.Data.ParameterDirection.Output;
p.Value = userId;
1 голос
/ 28 октября 2009

Вы могли также использовать параметр Output.

0 голосов
/ 28 октября 2009

Использование ...

Linq2Entities? Перетащите sproc в конструктор, и это будет функция в c #, возвращающая правильное значение. Linq2Sql? Перетащите sproc в конструктор, и это будет функция в c #, возвращающая правильное значение. ADO? - просто присвойте результат ExecuteScalar переменной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...