我的数据库中有一个表作为freespace ...它有一个名为freesize的列,其数据类型为int。
我有三个值:
1065189988
1073741818
1073741819
现在我尝试获得总可用空间,但是我收到了错误。
private void GetFreeSpace()
{
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection();
connection.ConnectionString = ConfigurationManager.ConnectionStrings["SumooHAgentDBConnectionString"].ConnectionString;
connection.Open();
SqlCommand sqlCmd = new SqlCommand("select sum(freesize)* 0.000000000931322575 as freespace from freespace", connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt);
connection.Close();
if (dt.Rows.Count > 0)
{
double freeSpace = Convert.ToDouble(dt.Rows[0]["freespace"].ToString());
}
}
将表达式转换为数据类型int的算术溢出错误。
Line 123: SqlCommand sqlCmd = new SqlCommand("select sum(freesize)* 0.000000000931322575 as freespace from freespace", connection);
Line 124: SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
Line 125: **sqlDa.Fill(dt);** here i get error
Line 126: connection.Close();
Line 127: if (dt.Rows.Count > 0)
有关如何在不更改数据类型的情况下获取freespace中的值的任何建议吗?
由于
我知道它适用于bigint,但我想要int。
答案 0 :(得分:3)
所以你要求3个大整数,然后乘以一个小的双,但仍然希望输出为int?
您可以将每行检索为int,然后在c#
中进行数学运算或者你可以在总和之前将int转换为bigint或double,这样你就不会溢出。
答案 1 :(得分:1)
据我所知,你有两个选择:使用Li0liQ的方法,大概是
SELECT SUM(freesize * 0.000000931322575) ...
由于准确性问题可能会很糟糕;或者,吸吮它并使用bigint。这提出了一个问题:你为什么如此关注使用int而不是bigint呢?如果你拥有的只是一把锤子,那就去坚果吧。但是,如果没有令人信服的理由,我至少会考虑使用bigint。
答案 2 :(得分:1)
单独的3个值的总和大于SQL中的Int的数据类型大小,其定义为范围: -2 ^ 31(-2,147,483,648)至2 ^ 31-1(2,147,483,647)
因此,您可以执行以下操作:
select cast(sum(cast(freesize as bigint))* 0.000000000931322575 as int) as freespace from freespace
这将支持数学运算并将结果作为INT返回,但是此强制转换将截断该值并返回2,而作为双精度则为2.99,因此您还希望对数字进行适当的SQL舍入。 / p>
答案 3 :(得分:0)
乘以C< 1,然后总结。
答案 4 :(得分:0)
首先乘以,然后SUM?
select cast(sum(freesize* 0.000000000931322575) as int)...
然而,正如Adam Gritt指出的那样,你想要2或3作为答案:圆形还是截断形?因此,扩展是回答...要正确处理截断,在转换为int之前添加0.5
select cast(sum(freesize* 0.000000000931322575) + 0.5 as int)...