我的数据库里有一张自由空间的桌子..。它有一个名为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)对于如何在不改变数据类型的情况下获得自由空间中的值,有什么建议吗?
谢谢
我知道它对bigint很有效,但我想要int。
发布于 2010-01-04 19:40:54
所以你要把3个大整数相加,然后乘以一个很小的两倍,但仍然希望输出是一个int?
您可以将每一行检索为int,然后在c#中进行计算。
或者,您可以在求和之前将整数转换为bigint或double,这样就不会在那里溢出。
发布于 2010-01-04 19:49:14
据我所知,您有两个选择:使用Li0liQ的方法,按
SELECT SUM(freesize * 0.000000931322575) ...这可能是因为准确性的问题,或者,吸吮它和使用bigint。这就提出了一个问题:为什么你这么关心使用int而不是bigint?如果你只有一把锤子,那就疯狂吧。但如果没有令人信服的理由不使用bigint,我至少会考虑使用bigint。
发布于 2010-01-04 19:49:40
仅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适当地舍入这个数字。
https://stackoverflow.com/questions/2001631
复制相似问题