2013-07-15 5 views
1

я написал эту функцию в SQLСкалярная функция SQL с 3 параметров в C#

alter function TVprest (@emitente int, @mes int, @ano int) 
returns float 
as 
begin 
    declare @tcu float; 

    select @tcu = sum(cast(vtprest as money)) 
    from ctrc 
    where emitente = @emitente and MONTH (EMISSAODATA) = @mes 
     and YEAR (EMISSAODATA)[email protected] and status = 'A' 

    if (@tcu is null) 
     set @tcu = 0; 

    return @tcu 
end 

И пытаюсь вызвать ту же функцию в C# с этим кодом:

public double TVprest (int emitente, int mess, int anno) 
{ 
     double saida; 
     SqlConnection abre1 = Tconex.GetConnection(); 
     SqlDataAdapter da3 = new SqlDataAdapter(); 

     if (abre1.State == ConnectionState.Closed) { abre1.Open(); } 

     SqlParameter emit = new SqlParameter("@emitente", SqlDbType.Int); 
     emit.Value = emitente; 

     SqlParameter mes = new SqlParameter("@mes", SqlDbType.Int); 
     mes.Value = mess; 

     SqlParameter ano = new SqlParameter("@ano", SqlDbType.Int); 
     ano.Value = ano; 

     SqlCommand TotalF = new SqlCommand("SELECT dbo.Tcupom(@emitente,@mes,@ano),", abre1); 
     TotalF.CommandType = CommandType.Text; 

     saida = Convert.ToDouble(TotalF.ExecuteScalar()); 
     return saida; 
    } 

При запуске я получаю это ошибка:

Не удалось преобразовать значение параметра от SqlParameter к Int32

Что не так? Вызов функции с этими параметрами:

double Tvprest = impx.TVprest(504, 5, 2013); 
    lblVtprest.Text = Tvprest.ToString(); 
+0

btw; вы видите, что назначаете 'ano.Value = ano;' - должно быть '= anno'? –

+0

Подождите минуту. Ваш C#, похоже, вообще не вызывает хранимую процедуру. Как здесь хранится процедура? – catfood

ответ

4

Вы не добавили параметры вашей команды

SqlCommand TotalF = new SqlCommand("SELECT dbo.Tcupom(@emitente,@mes,@ano),", abre1); 
TotalF.Parameters.Add(emit); 
TotalF.Parameters.Add(mes); 
TotalF.Parameters.Add(ano); 
saida = Convert.ToDouble(TotalF.ExecuteScalar()); 

Однако, я думаю, что вам не хватает, чтобы объяснить что-то в вашем вопросе. У вас есть функция TVprest, но вы вызываете SELECT dbo.Tcupom. Непонятно, что это такое Tcupom

+0

просто с точки зрения удобства и простоты кода: 'TotalF.Parameters.AddWithValue (« emitente », emitente); TotalF.Parameters.AddWithValue ("mes", беспорядок); TotalF.Parameters.AddWithValue ("ano", anno); 'и т. Д. –

+0

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

+0

И что это за новая проблема? – Steve

1

Основная ошибка здесь заключается в том, что Стив справедливо отмечает, что не добавлял параметры правильно. Однако, как общий трюк с ошибкой обхода кода, вы можете попробовать такие инструменты, как dapper, которые значительно усложняют задачу. Например:

return abre1.Query<double>("SELECT dbo.Tcupom(@emitente,@mess,@anno)", 
    new { emitente, mess, anno }).Single(); 

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

string region = ... 
var customers = connection.Query<Customer>(
     "select * from Customers where Region = @region", 
     new { region }).ToList(); 
Смежные вопросы