Арифметическая проблема переполнения - PullRequest
1 голос
/ 04 января 2010

У меня есть таблица в моей базе данных в качестве свободного пространства ... в ней есть столбец с именем 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.

Ответы [ 5 ]

3 голосов
/ 04 января 2010

Итак, вы суммируете 3 больших целых числа, затем умножаете на крошечное двойное число, но все же хотите, чтобы результат был целым числом?

вы можете получить каждую строку как целое число, а затем сделать свою математику в c #

или вы можете привести int к значению bigint или double перед суммой, чтобы не переполнять его.

1 голос
/ 04 января 2010

Сумма только трех значений больше, чем размер типа данных для Int в SQL, который определяется как диапазон: От -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 округлял число соответственно. 1006 *

1 голос
/ 04 января 2010

Насколько я могу судить, у вас есть два варианта: использовать подход Li0liQ, что-то порядка

SELECT SUM(freesize * 0.000000931322575) ...

, который может сосать из-за проблем с точностью; или сосать его и использовать bigint. Возникает вопрос: почему вы так озабочены использованием int, а не bigint? Если все, что у вас есть, это молоток, то сходите с ума. Но я бы хотя бы подумал об использовании bigint, если нет веских причин не делать этого.

0 голосов
/ 04 января 2010

Сначала умножить, затем СУММУ?

select cast(sum(freesize* 0.000000000931322575) as int)...

Однако, как указал Адам Гритт, вы хотите, чтобы ответом было 2 или 3: округление или усечение? Итак, расширение - это ответ ... Для правильного округления, как в случае с усечением, добавьте 0.5 перед приведением к int

select cast(sum(freesize* 0.000000000931322575) + 0.5 as int)...
0 голосов
/ 04 января 2010

Умножьте на C <1, а затем сложите. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...