最近接了一个毕业设计的项目,到现在接近尾声了。很诡异的是,刚刚在做金额总额的时候,碰到了一个很奇怪的问题,我不知道各位童鞋有没有和我一样的经历,呵呵~~~我来分享一下吧。因因毕业设计是有关租房的,所以有一个字段是"zujin"(租金[我承认这个命名真的很恶心]),当我在models的时候,我是这样定义它的:
/*月租金*/ private float zujin; public void setZujin(float zujin) { this.zujin = zujin; } public float getZujin() { return this.zujin; }
这里的字段是 float,没有错。然后,我做金额总和的时候,去取它的值,如下:
protected float getZujinByHourseID(int housrID)
{
float zujin = 0;
using (SqlConnection conn = new SqlConnection(str))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
string strSQL = "select zujin from hourse where hourseId=@hourseId ";
cmd.CommandText = strSQL;
cmd.Parameters.AddWithValue("hourseId", housrID);
zujin = (float)(cmd.ExecuteScalar());
}
}
return zujin;
}
上面蓝色字体就是我们所关注的代码,因为在数据库中把"zujin"这个字段的类型设置为了float,所以我想在我取的时候,也应该是这个类型。
ExecuteSclalar()这个函数是从select中取出第一行的第一条数据,在本例中也就是租金。可是,但我运行的时候,发现“类型转换错误”,报错。
我刚开始,很纳闷。然后赶忙去检查数据库中的字段类型,然后又检查models里的类型,都没错啊!经过调试在调试之后,我就开始了最原始的办法,一个一个类型的进行转换。
最后,功夫不负有心人,找到了这个Convert.ToSingle 函数 转换成功。然后,我刚开始以为这会对精度有影响,但后来我确认后,对精度没有影响。还好。
自此,正确代码如下:
protected float getZujinByHourseID(int housrID) { float zujin = 0; using (SqlConnection conn = new SqlConnection(str)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { string strSQL = "select zujin from hourse where hourseId=@hourseId "; cmd.CommandText = strSQL; cmd.Parameters.AddWithValue("hourseId", housrID); zujin = Convert.ToSingle(cmd.ExecuteScalar()); } } return zujin; }
还有后面取的值,也是这样用的:
while (dr.Read()) { float LiveWater =Convert.ToSingle(dr.GetDouble((dr.GetOrdinal("LiveWater")))); float Other = Convert.ToSingle(dr.GetDouble((dr.GetOrdinal("Other")))); Response.Write("生活费d:" + LiveWater + "其他费用:" + Other); }
我这里还是觉得float,用的很不方便,一不小心 会把人给折磨怕的,就比如我吧,昨天晚上我足足的弄到了3点钟,牺牲了好多的睡眠,真实可惜。所以,我还是在建议在存储字段类型到时候,用double 比较安全吧。当然,只是个人建议。呵呵!