我试图像这样处理DbNull异常:
string sql_com_sumcastka = "SELECT SUM(price) AS sumprice FROM kliplat WHERE akce='" + zakce.Text + "' AND year=" + year;
SqlCommand sc2 = new SqlCommand(sql_com_sumprice, spojeni);
spojeni.Open();
if (sc2 != DBNull.Value)
{
int result = Convert.ToInt32(sc2.ExecuteScalar());
}
else
{
int result = 0;
}
spojeni.Close();
string sql_com_update_sum = "UPDATE zajezd SET s_prijmy=@s_prijmy WHERE akce='"+zakce.Text+"' AND year="+year;
SqlCommand sc3 = new SqlCommand(sql_com_update_sum,spojeni);
sc3.Parameters.AddWithValue("@s_prijmy", result );
spojeni.Open();
sc3.ExecuteNonQuery();
spojeni.Close();
但由于我不知道如何正确处理结果是否为DBNull我得到这个错误:Operator '"=' cannot be applied to operands of type system.Data.SqlClient.SqlCommand and System.Dbnull
和
当前上下文中不存在名称“结果”
我的问题是这行代码:
if (sc2 != DBNull.Value)
{
int result = Convert.ToInt32(sc2.ExecuteScalar());
}
else
{
int result = 0;
}
感谢您的帮助。
答案 0 :(得分:2)
ExecuteScalar不返回DBNull但返回null,您需要测试ExecuteScalar的返回值而不是执行命令的SqlCOmmand
int sumOfPrice = 0;
object result = sc2.ExecuteScalar();
if(result != null)
sumOfPrice = Convert.ToInt32(result);
ExecuteScalar返回结果中第一行的第一列 如果结果集,则设置或空引用(在Visual Basic中为Nothing) 是空的。
作为旁注,请不要使用字符串连接来构建要传递到数据库的命令文本。您冒险进行Sql Injection并解析错误。请使用像这样的参数化查询
string sql_com_sumcastka = "SELECT SUM(price) AS sumprice FROM kliplat " +
"WHERE akce=@zak AND year=@year";
SqlCommand sc2 = new SqlCommand(sql_com_sumprice, spojeni);
sc2.Parameters.AddWithValue("@zak", zakce.Text);
sc2.Parameters.AddWithValue("@year", year);
答案 1 :(得分:1)
这是正确的方法
var objResult = sc2.ExecuteScalar();
if (objResult != DBNull.Value && objResult != null )
{
int result = (int)objResult; //you can just do a normal cast, "SUM(X)" returns a int.
}
else
{
int result = 0;
}
答案 2 :(得分:0)
在您的示例中永远无法将SqlCommand
与DBNull.Value
进行比较。你想要的是检查执行标量调用的结果,看看它是否为null:
var result = sc2.ExecuteScalar();
if(result as DBNull == null)
{
// value is not null, do processing
}
答案 3 :(得分:0)
我知道答案很晚,但这是我找到的最简单的答案
SELECT (SUM(price),0) FROM kliplat
如果结果为null
,则会将其替换为0