的ExecuteScalar没有返回正确的价值观C#

问题描述:

让我先发布我的代码开始:的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 && returnValue != DBNull.Value && returnValue is T) 
      ? (T)returnValue 
      : default(T); 
     }, parameters); 

    }   
} 

Execute方法:

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); 
      } 

     } 

    } 

ExecuteScalar方法的调用

komanda = "begin;select count(*) from radni_sati where [email protected] and [email protected]" + 
         " 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(); 

现在我的问题是当我拨打ExecuteScalar()

由于某种原因,我的ExecuteScalar总是返回0作为结果,并不能因为我测试它作为一个普通的查询在PSQL壳和它总是返回值> 0当我调用合法查询,必须返回正常值。

第一次通话后进入ExecuteScalar,从兰巴符返回returnValue和例如其16,那么当它去执行功能,不知何故,返回0,我不明白为什么,怎么把主要的东西,我需要ExecuteScalar为将返回count(*)的值作为int

+2

请检查c.ExecuteScalar的返回值。如果这不是预期的类型,则返回默认值(T)(在本例中为default(int)),该值计算为零(即使SQL语句返回另一个值)。 –

+0

@RalfBönning你可以将这个问题作为一个答案给出一个你想要说什么的例子,如果我在'default'或'returnValue'上把'T'改成'int',我必须改变整个类型的方法为int '为了工作的方法 –

+0

只要删除'是T'测试。如果剧组失败,则应抛出异常......但是,作为一种特殊情况,你应该没问题(你没有得到你期望的类型)。你的数据库提供者可能会返回一个'short'或者'long'或者'BigInteger',或许它会返回一个包含整数的'float' ......这些都不会是T,例如'int'所以测试失败并返回整数类型为零的缺省值(T)。 – pinkfloydx33

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