ExecuteScalar不能返回正确的值C# [英] ExecuteScalar not returning right values C#

查看:159
本文介绍了ExecuteScalar不能返回正确的值C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



ExecuteScalar方法:

  public T ExecuteScalar< T>(string sql,CommandType commandType,List< NpgsqlParameter> parameters)
{
using(NpgsqlConnection conn = Konekcija_na_server.Spajanje(spoji))
{
return Execute< T>(sql,commandType,c =>
{
var returnValue = c.ExecuteScalar();
return(returnValue!= null&& amp ; returnValue!= DBNull.Value&& returnValue是T)
?(T)returnValue
:default(T);
},parameters);


$ b

执行方法:



$ p $ T执行< T>(字符串sql,CommandType commandType,Func< NpgsqlCommand,T>函数,List< NpgsqlParameter>参数)
{
using(NpgsqlConnection conn = Konekcija_na_server.Spajanje(spoji))
{
using(var cmd = new NpgsqlCommand(sql,conn))
{
cmd.CommandType = commandType;
if(parameters.Count> 0)
{
foreach(参数中的var参数)
{
cmd.Parameters.AddWithValue(parameter.ParameterName,parameter。值);
}
}
返回函数(cmd);
}

}

}

调用ExecuteScalar方法:

  komanda =begin; select count(*)from radni_sati where ime = @ ime and prezime = @ prezime+ 
和(dolazak不为null,odlazak不为null,sati_rada不为null)和napomena =''; commit;;
listaParametara.Add(new NpgsqlParameter {ParameterName =@ime,Value = ime});
listaParametara.Add(new NpgsqlParameter {ParameterName =@prezime,Value = prezime});
var nePrazni_redovi = instanca.ExecuteScalar< int>(komanda,CommandType.Text,listaParametara);
listaParametara.Clear();

现在我的问题是当我调用 ExecuteScalar() ExecuteScalar 总是返回0作为结果,并且不能成为我测试的结果。

它作为PSQL Shell中的普通查询,当我调用必须返回正常值的合法查询时,它总是返回大于0的值。

第一次输入 ExecuteScalar 在调用之后,从lamba运算符返回一个 returnValue ,例如它的16,然后当它进入Execute函数时,它返回0,我不明白为什么,因为主要的事情我需要 ExecuteScalar 是为了返回 count(*) value out一个 int

解决方案

你能告诉我们你怎么调用ExecuteScalar ? T是什么类型?此外,将断点设置为: var returnValue = c.ExecuteScalar(); 并检查在跳过该行(F10)后返回的类型。在Visual Studio的监视窗口中,您应该检查Type列。


Let me start by posting my code first:

ExecuteScalar method:

public T ExecuteScalar<T>(string sql, CommandType commandType, List<NpgsqlParameter> parameters)
{
    using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji")) 
    {
        return Execute<T>(sql, commandType, c =>
        {
            var returnValue = c.ExecuteScalar();
            return (returnValue != null && returnValue != DBNull.Value && returnValue is T)
             ? (T)returnValue 
             : default(T); 
        }, parameters);

    }        
}

Execute method:

 T Execute<T>(string sql, CommandType commandType, Func<NpgsqlCommand, T> function, List<NpgsqlParameter> parameters)
    {
        using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji")) 
        {
            using (var cmd = new NpgsqlCommand(sql, conn))
            {
                cmd.CommandType = commandType;
                if (parameters.Count > 0 ) 
                {
                    foreach (var parameter in parameters) 
                    {
                        cmd.Parameters.AddWithValue(parameter.ParameterName,parameter.Value);
                    }
                }
                return function(cmd);
            }

        }

    }

Call of ExecuteScalar method:

komanda = "begin;select count(*) from radni_sati where ime=@ime and prezime=@prezime" +
                      " and (dolazak is not null and odlazak is not null and sati_rada is not null) and napomena='' ;commit;";
            listaParametara.Add(new NpgsqlParameter { ParameterName = "@ime", Value = ime });
            listaParametara.Add(new NpgsqlParameter { ParameterName = "@prezime", Value = prezime });
            var nePrazni_redovi=instanca.ExecuteScalar<int>(komanda, CommandType.Text, listaParametara); 
            listaParametara.Clear();

Now my problem is when I call ExecuteScalar().

For some reason my ExecuteScalar always returns 0 as result and that can't be coz I tested it as a normal query in PSQL Shell and it always returns values>0 when I call legit query that has to return normal value.

First time It enters ExecuteScalar after a call, returns a returnValue from lamba operator and for example its 16, then when it goes to Execute function, somehow it returns 0 and I dont understand why, coz main thing I need ExecuteScalar for is to return count(*) value out as an int.

解决方案

can you tell us how are you calling ExecuteScalar? What type is T? Also, set breakpoint to: var returnValue = c.ExecuteScalar(); and check what type is returned after you step over that line (F10). In watch window of Visual Studio you should check Type column.

这篇关于ExecuteScalar不能返回正确的值C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆