大家好我输入字符串有问题,我想我知道这个问题的原因但是我无法解决它。
我有一个数据库,我正在使用返回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;
}
}
答案 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
答案 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()方法,这将帮助你。