如果DBNull问题,则执行标量

本文关键字:执行 标量 DBNull 问题 如果 | 更新日期: 2023-09-27 18:29:02

我试图处理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

名称"result"在当前上下文中不存在

我的问题是这行代码:

if (sc2 != DBNull.Value)
        {
            int result = Convert.ToInt32(sc2.ExecuteScalar());
        }
        else
        {
            int result = 0;
        }

谢谢你的帮助。

如果DBNull问题,则执行标量

ExecuteScalar不返回DBNull(除非…,请阅读下面的注释),而是null,并且您需要测试Execute标量的返回值,而不是执行命令的SqlCommand

   int sumOfPrice = 0;
   object result = sc2.ExecuteScalar();
   if(result != null)
       sumOfPrice = Convert.ToInt32(result);

来自MSDN

ExecuteScalar返回结果中第一行的第一列如果结果集是空的。

附带说明一下,不要使用字符串串联来构建要传递到数据库的命令文本。您有Sql注入和解析错误的风险。请使用类似的参数化查询

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

以下是实现的正确方法

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

在您的示例中,SqlCommand永远无法与DBNull.Value进行比较。听起来你想要的是检查执行标量调用的结果,看看它是否为空:

var result = sc2.ExecuteScalar();
if(result as DBNull == null)
{
    // value is not null, do processing
}

我知道答案很晚了,但这是我找到的最简单的答案

SELECT (SUM(price),0) FROM kliplat 

如果结果为null,则将替换为0