2013-02-11 5 views
17

У меня есть хранимая процедураПолучить возвращаемое значение из хранимой процедуры в asp.net

ALTER PROC TESTLOGIN 
    @UserName varchar(50), 
    @password varchar(50) 
As 
Begin 
    declare @return int; 

    set @return = (SELECT COUNT(*) 
        FROM CPUser 
        WHERE UserName = @UserName 
        AND Password = @password); 

    return @return; 
End 

и в C#

SqlConnection con = db.con; 
SqlCommand cmd = new SqlCommand("TESTLOGIN", con); 
cmd.CommandType = CommandType.StoredProcedure; 

SqlParameter parm = new SqlParameter("@return", SqlDbType.Int); 
parm.Direction = ParameterDirection.ReturnValue; 

cmd.Parameters.Add(parm); 
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim())); 
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim())); 

cmd.ExecuteNonQuery(); 
con.Close(); 

int id = Convert.ToInt32(parm.Value); 

но всегда возвращает 0. Пожалуйста, помогите мне решить эту проблему

+0

Вы уверены, что процедура не возвращается 0? – adt

+0

@adt, если он выполняется непосредственно в SQL Server, он работает правильно, но в C# он всегда дает 0 –

+0

возможный дубликат [Получение возвращаемого значения из хранимой процедуры в C#] (http://stackoverflow.com/questions/706361/ get-return-value-from-stored-procedure-in-c-sharp) –

ответ

30

Вам необходимо указать параметр с номером ParameterDirection.ReturnValue, но не нужно добавлять дополнительный параметр в SP. Попробуйте это

SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int); 
    returnParameter.Direction = ParameterDirection.ReturnValue; 
    cmd.ExecuteNonQuery(); 

    int id = (int) returnParameter.Value; 
+0

спасибо, работая хорошо. (Обратите внимание, что в это время 'Parameters.Add' устарел) – danihp

+1

' Parameters.Add (string parameterName, object value) 'устарел, но' Parameters.Add (string parameterName, SqlDbType sqlDbType) 'is not. –

+0

Я возвращаю значение строки, но это дает исключение. «Конверсия не удалась при преобразовании значения varchar« мое возвращаемое значение »в тип данных int.' – SMI

1

Вы можете попробовать это. Добавьте параметр как направление вывода и после выполнения запроса получите значение выходного параметра.

SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int); 
    parmOUT.Direction = ParameterDirection.Output; 
    cmd.Parameters.Add(parmOUT); 
    cmd.ExecuteNonQuery(); 
    int returnVALUE = (int)cmd.Parameters["@return"].Value; 
-3

ли это таким образом (внести необходимые изменения в коде) ..

  SqlConnection con = new SqlConnection(GetConnectionString()); 
      con.Open(); 
      SqlCommand cmd = new SqlCommand("CheckUser", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter p1 = new SqlParameter("username", username.Text); 
      SqlParameter p2 = new SqlParameter("password", password.Text); 
      cmd.Parameters.Add(p1); 
      cmd.Parameters.Add(p2); 
      SqlDataReader rd = cmd.ExecuteReader(); 
      if(rd.HasRows) 
      { 
       //do the things 
      } 
      else 
      { 
       lblinfo.Text = "abc"; 
      } 
+0

Это не лучшая альтернатива, так как она добавляет накладные расходы на устройство чтения данных.Выходной параметр является наиболее эффективным способом. – Lukos

0

Процедура никогда не возвращает value.You должны использовать выходной параметр в процедуре сохранения.

ALTER PROC TESTLOGIN 
@UserName varchar(50), 
@password varchar(50) 
@retvalue int output 
as 
Begin 
    declare @return  int 
    set @return = (Select COUNT(*) 
    FROM CPUser 
    WHERE UserName = @UserName AND Password = @password) 

    set @[email protected] 
    End 

Затем вам нужно добавить sqlparameter из C#, направление которого отсутствует. Надеюсь, что это имеет смысл.

+8

Вы ошибаетесь, хранимая процедура в SQL Server * всегда * возвращает значение, которое всегда является значением 'int'. Возможно, вы никогда не получали возвращаемое значение в своих запросах, но это не значит, что у SP нет его. Пожалуйста, обратите внимание на [RETURN manual] (http://msdn.microsoft.com/en-us/library/ms174998.aspx «RETURN (Transact-SQL)»). –

+0

Я получил возвращаемое значение в моих запросах. Но я забыл упомянуть об этом. Также я изучил в руководстве RETURN, чья ссылка предоставлена ​​вами. Спасибо за ссылку и реформирование моего ответа. – user1990587

+0

его не работает –

2

2 вещи.

  • Запрос должен быть заполнен на сервере sql перед отправкой возвращаемого значения.

  • Результаты должны быть захвачены, а затем закончить выполнение перед . Возвращаемое значение получает объект.

На английском языке завершите работу, а затем извлеките значение.

это не будет работать:

   cmm.ExecuteReader(); 
       int i = (int) cmm.Parameters["@RETURN_VALUE"].Value; 

Это будет работать:

     SqlDataReader reader = cmm.ExecuteReader(); 
         reader.Close(); 

         foreach (SqlParameter prm in cmd.Parameters) 
         { 
          Debug.WriteLine(""); 
          Debug.WriteLine("Name " + prm.ParameterName); 
          Debug.WriteLine("Type " + prm.SqlDbType.ToString()); 
          Debug.WriteLine("Size " + prm.Size.ToString()); 
          Debug.WriteLine("Direction " + prm.Direction.ToString()); 
          Debug.WriteLine("Value " + prm.Value); 

         } 

, если вы не уверены, проверьте значение параметра до, во время и после того, как результаты были обработаны читатель.

-2

Если вы хотите узнать, как вернуть значение из хранимой процедуры в Visual Basic.NET. Пожалуйста, прочитайте этот учебник: How to return a value from stored procedure

Я использовал следующую хранимую процедуру для возврата значения.

CREATE PROCEDURE usp_get_count 

AS 
BEGIN 
DECLARE @VALUE int; 

SET @VALUE=(SELECT COUNT(*) FROM tblCar); 

RETURN @VALUE; 

END 
GO 
+0

Добро пожаловать в [so]. При ответе на вопросы, пожалуйста, не забудьте указать какую-либо связь с любыми ссылками или ссылками в сообщении. Благодаря! –

Смежные вопросы