1

我已经用 SQL 编写了这个函数

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)=@ano 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(); 
4

2 回答 2

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

于 2013-07-15T20:01:16.653 回答
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();
于 2013-07-15T20:11:29.357 回答