检查数据读取器在解析为double时是否返回null

时间:2017-10-10 09:23:36

标签: c# sql sql-server

大家好我输入字符串有问题,我想我知道这个问题的原因但是我无法解决它。

我有一个数据库,我正在使用返回null的请求,因为该表为空。 null我将它作为双精度返回。所以我想创建一个条件来验证它是否为null。

这是我的方法:

 public static double CREDIT()
    {
        double Total;
        try
        {
            CLSERVICES.CON.Open();
            string req = "select SUM(F.Reste)from RELATION as R , Facture as F where R.NRelation = F.Relation";
            SqlCommand cmd = new SqlCommand(req, CLSERVICES.CON);
            SqlDataReader dr;
            dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                Total= double.Parse(dr.GetValue(0).ToString());
            }
            else
            {
                Total= 0;
            }
            dr.Close();
            CLSERVICES.CON.Close();
            return Total;
        }
        catch (SqlException E)
        {
            MessageBox.Show(E.Message, "<!!!>", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return 0;
        }
    }

4 个答案:

答案 0 :(得分:3)

这是编写方法的更好方法:

public static double CREDIT()
{
    try
    {
        string req = "select SUM(F.Reste) "+
                        "from RELATION as R "+
                        "inner join Facture as F "+
                        "ON R.NRelation = F.Relation";
        using (var con = new SqlConnection(ConnectionString))
        {
            using (var cmd = new SqlCommand(req, con))
            {
                con.Open();
                var value = cmd.ExecuteScalar();
                double total;
                if (value != null && value != DBNull.Value && double.TryParse(value.ToString(), out total))
                {
                    return total;
                }
            }
        }
    }
    catch (SqlException E)
    {
        MessageBox.Show(E.Message, "<!!!>", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    return 0;
}

兴趣点:

  • 使用本地连接对象,以便可以尽快关闭和处理它。
  • IDisposable语句
  • 中换行所有using个实例
  • 使用ExecuteScalar()代替ExecuteReader(),因为您只想获得单个标量值
  • 使用double.TryParse代替double.Parse
  • 将sql断行以提高可读性
  • 将隐式内部联接更改为显式联接

答案 1 :(得分:0)

你可以:

将您的double.Parse更改为double.TryParse(解析数字时应始终这样做)

和/或

使用https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull(v=vs.110).aspx

测试null

这是如何使用isDBNull:

if (!dr.IsDBNull(0))
{
    Total = double.Parse(dr.GetValue(0).ToString());
}

并且可能考虑让你的方法返回一个double?如果它可能为null,则代替双重

另外,考虑使用ExecuteScalar而不是ExecuteReader

答案 2 :(得分:-1)

你的问题来自于不在此行中检查null:

Total= double.Parse(dr.GetValue(0).ToString());

dr.GetValue(0)可能为null或者甚至不是double,所以你可以这样做:

var val = dr.GetValue(0);

if ( val != null )
{
    Double.TryParse(val.ToString(), out Total);
}

答案 3 :(得分:-1)

Total = Convert.ToDouble(dr.GetValue(0));

使用上面的行而不是Double.Parse()方法,这将帮助你。