的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
。
答
你能告诉我们你怎么叫ExecuteScalar? T是什么类型?此外,将断点设置为:var returnValue = c.ExecuteScalar();
并检查在跳过该行(F10)后返回的类型。在Visual Studio的监视窗口中,您应该检查Type列。
请检查c.ExecuteScalar的返回值。如果这不是预期的类型,则返回默认值(T)(在本例中为default(int)),该值计算为零(即使SQL语句返回另一个值)。 –
@RalfBönning你可以将这个问题作为一个答案给出一个你想要说什么的例子,如果我在'default'或'returnValue'上把'T'改成'int',我必须改变整个类型的方法为int '为了工作的方法 –
只要删除'是T'测试。如果剧组失败,则应抛出异常......但是,作为一种特殊情况,你应该没问题(你没有得到你期望的类型)。你的数据库提供者可能会返回一个'short'或者'long'或者'BigInteger',或许它会返回一个包含整数的'float' ......这些都不会是T,例如'int'所以测试失败并返回整数类型为零的缺省值(T)。 – pinkfloydx33