Нужно вернуть значение из хранимой процедуры в C #

2

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

код С#, необходимо получить результат хранимой процедуры

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 return to result
       result = Convert.ToString(cmd.Parameters["@UserId"].Value);
   }
   catch (Exception ex)
   {
       throw;
   }
   finally
   {
       cmd.Connection.Close();
   }

   return result;
}

Как вернуть результат моей хранимой процедуры на С#?

Теги:
stored-procedures

6 ответов

6
Лучший ответ

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

  • 0
    простые вещи, вот что я искал. Также вы должны привести к нужному типу, в данном случае это String.
  • 0
    Да, это самый простой ответ.
Показать ещё 2 комментария
7

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

Я возвращал различные коды возврата, основанные на логике в моем коде, и execcescalar не поможет, так как я хотел бы вернуть из сохраненного proc между ними везде, где это необходимо, с соответствующим кодом и не использовать 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 return to result  
       result = Convert.ToString(cmd.Parameters["@Return_Value"].Value);  
   }  
   catch (Exception ex)  
   {  
       throw;  
   }  
   finally  
   {  
       cmd.Connection.Close();  
   }  

   return result;  
}  
  • 0
    Обратите внимание, что имя параметра является произвольным, ключевым фактором является направление ReturnValue. У вас может быть только один параметр для команды с направлением ReturnValue. Также обратите внимание, что имя параметра не соответствует ни одному из существующих параметров, объявленных для этой команды.
4

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

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

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

  • 0
    Для того чтобы это работало, @UserID должен быть отмечен как выходной параметр в сохраненном процессе.
  • 0
    Ах да, ты прав. @ Крис Баланс, прислушайся к совету Райана, если ты воспользуешься этим подходом! Я буду редактировать.
Показать ещё 1 комментарий
3

Вы также можете использовать параметр 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;
  • 0
    Это может включать изменение самой хранимой процедуры, добавление параметра в команду, используя направление System.Data.ParameterDirection.ReturnValue - это все, что вам нужно для захвата значения Return из хранимой процедуры.
1

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

-2

используя...

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

  • 0
    @Russell, для этого и нужны теги, они четко заявляют, что он использует SQL C # и его источник в SQL.
  • 0
    JonH - Это все действительные способы сделать это в C # с SQL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню