2013-12-01 4 views
0

Я вызываю хранимую процедуру, написанную на сервере sql, в моей службе C#. Но я снова и снова перед исключением:Получение результата из хранимой процедуры в C#

InvalidCastException был необработанным код пользователя: Указанный литой не является действительным

Код:

public function(Data dt) 
{ 
    con = new SqlConnection(constring); 
    string brand = dt.brand; 
    cmd = new SqlCommand("execute pro100 @brand, @check", con); 

    SqlParameter param = new SqlParameter("@check", SqlDbType.Int); 
    param.Direction = ParameterDirection.Output; 
    cmd.Parameters.Add("@brand", brand); 
    cmd.Parameters.Add(param); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 

    int result = (int)cmd.Parameters["@check"].Value; // Exception is here 
    con.Close(); 
    return result; 
} 

Моей хранимая процедура выглядит следующим образом This представляет собой хранимую процедуру

ALTER PROCEDURE [dbo].[pro100] 
@brand varchar(20), 
@check int output 
as 
update carlog set minex=1000 where [email protected]; 
select @check=id from carlog where [email protected]; 
return @check 

Может ли кто-нибудь предложить возможное решение?

+0

игнорировать патетический грамматический смысл. –

+0

Когда акты недействительны, вы смотрите на тип значения, которое вы пытались выполнить, чтобы убедиться, что оно ожидается. Это касается практически всех недействительных трансляций. – usr

+0

@NikunjVats в следующий раз, пожалуйста, разместите свой код вместо изображения, потому что изображения часто становятся недоступными, когда время проходит –

ответ

0

Вот это решение, которое игнорирует обработку исключений:

public function(Data dt) 
{ 
    con = new SqlConnection(constring); 

    cmd = new SqlCommand("pro100", con); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.AddWithValue("@brand", dt.brand); 
    cmd.Parameters.Add("@check", SqlDbType.Int).Direction = ParameterDirection.Output; 

    con.Open(); 
    cmd.ExecuteNonQuery(); 
    int result = Convert.ToInt32(cmd.Parameters["@check"].Value); 
    con.Close(); 
    return result; 
} 
+0

Используйте TryParse, когда вы получите это значение Int32: http://msdn.microsoft.com/en-us/library/system.int32.tryparse(v=vs.110).aspx –

0

Я всегда повторно использовать переменную, которая содержит параметр для output параметров, как это: -

public function(Data dt) 
{ 
    con = new SqlConnection(constring); 
    string brand = dt.brand; 
    cmd = new SqlCommand("execute pro100", con); 

    SqlParameter param = new SqlParameter("@check", SqlDbType.Int); 
    param.Direction = ParameterDirection.Output; 
    cmd.Parameters.Add("@brand", brand); 
    cmd.Parameters.Add(param); 
    con.Open(); 
    cmd.ExecuteNonQuery(); 

    int? result = (int?)param.Value; // Exception was here 
    con.Close(); 
    return result; 
} 

Но вы можете также необходимо обрабатывать значения null, возвращаемые из хранимой процедуры, - никогда не возвращая null - или путем литья в C# к типу, который может содержать значения NULL (как указано выше). Я также сбросил список параметров из текста команды - по мере добавления параметров в код к коллекции параметров.

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

  • Нет связанных вопросов^_^