首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecuteScalar如果DBNull问题

ExecuteScalar如果DBNull问题
EN

Stack Overflow用户
提问于 2013-08-26 17:42:26
回答 4查看 9.9K关注 0票数 2

我试图像这样处理DbNull异常:

代码语言:javascript
复制
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

名称“结果”在当前上下文中不存在

我的问题是这行代码:

代码语言:javascript
复制
if (sc2 != DBNull.Value)
        {
            int result = Convert.ToInt32(sc2.ExecuteScalar());
        }
        else
        {
            int result = 0;
        }

谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-26 17:45:32

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

代码语言:javascript
复制
   int sumOfPrice = 0;
   object result = sc2.ExecuteScalar();
   if(result != null)
       sumOfPrice = Convert.ToInt32(result);

来自MSDN

ExecuteScalar返回结果集中第一行的第一列,如果结果集为空,则返回空引用( Visual中为空)。

请注意,不要使用字符串连接来构建要传递给数据库的命令文本。您将面临Sql注入和解析错误的风险。使用下面这样的参数化查询

代码语言:javascript
复制
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);
票数 6
EN

Stack Overflow用户

发布于 2013-08-26 17:54:10

以下是正确的方法

代码语言:javascript
复制
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;
}
票数 6
EN

Stack Overflow用户

发布于 2013-08-26 17:45:05

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

代码语言:javascript
复制
var result = sc2.ExecuteScalar();

if(result as DBNull == null)
{
    // value is not null, do processing
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18449847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档