算术溢出问题

时间:2010-01-04 19:35:48

标签: c# asp.net sql-server-2005 types

我的数据库中有一个表作为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。

5 个答案:

答案 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)...