Как мне конвертировать int в double? - PullRequest
1 голос
/ 13 апреля 2011

У меня проблемы с преобразованием значений int в double. Я знаю, что должен их разыграть, и я пытаюсь это сделать; но C # все еще дает мне ошибку для преобразования int в double и говорит, что мне нужно приведение. Также это дает мне ошибку при попытке получить значение для totalunits по значениям. он говорит: "** Локальная переменная с именем 'values' не может быть объявлена ​​в этой области, поскольку она будет придавать другое значение значениям" values ​​", которые уже используются в родительской или текущей области для обозначения некоторых еще. Я запутался в этой ошибке, потому что я хочу, чтобы totalunits также менял значения. Может ли кто-нибудь помочь мне? Спасибо.

Justin

Вот мой код:

//Get the Refurb_Rate for the day


private double GetRefurbRate()
{
    string sql = "";
    double Refurb_Rate = 0;
    int totalRefurb = 0;
    int totalUnits = 0;
    string error_msg = "";

        //Getting the value for sql for totalRefurb
        sql = "SELECT COUNT(distinct rp.repair_ord) " +
           "FROM " + schema + ".repair_part rp " +
           "WHERE rp.repair_type = 'REFURB' and rp.created_date > '" + DateTime.Now.ToString("d-MMM-yyyy") + "' ";


        while (true)
        {
            if (!myDb.RunSql(sql, true))
            {
                error_msg = "DBError for getting Refurb Rate";
                break;
            }
            if (myDb.dbRdr.HasRows)
            {
                if (myDb.dbRdr.Read())
                {


                    object[] values = new object[myDb.dbRdr.FieldCount];
                    myDb.dbRdr.GetValues(values);
                    Console.WriteLine(values[0].ToString());
                    totalRefurb = Convert.ToDouble(values[0].ToString());());// This is where convert to double error comes in.


                    //Getting the value from sql for totalUnits
                    sql = "SELECT count(distinct rp.repair_ord) " +
                        "FROM " + schema + ".repair_part rp " +
                        "WHERE rp.repair_type = 'REFURB' and rp.ref_desig is null  and rp.created_date > '" + DateTime.Now.ToString("d-MMM-yyyy") + "' ";

                    while (true)
                    {
                        if (!myDb.RunSql(sql, true))
                        {
                            error_msg = "DBError for getting Refurb Rate";
                            break;
                        }
                        if (myDb.dbRdr.HasRows)
                        {
                            if (myDb.dbRdr.Read())
                            {

                                // This is where the values error comes in
                                object[] values = new object[myDb.dbRdr.FieldCount];
                                myDb.dbRdr.GetValues(values);
                                Console.WriteLine(values[1].ToString());
                                totalUnits = Convert.ToDouble(values[1].ToString());// This is where convert to double error comes in.

                                try
                                {

                                    //Formula for Refurb Rate
                                    Refurb_Rate = totalRefurb / totalUnits * 100;


                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine(e);
                                }

                            }

                        }

                        break;
                    }
                    myDb.dbRdr.Close();

                    if (error_msg != String.Empty)
                    {
                        MessageBox.Show(error_msg, "Get Refurb Rate",
                                        MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }

                    return Refurb_Rate;
                }
            }
        }
    }

Ответы [ 6 ]

4 голосов
/ 13 апреля 2011

Изменить второе object[] values = new object[myDb.dbRdr.FieldCount];
до values = new object[myDb.dbRdr.FieldCount];
или object[] values2 = new object[myDb.dbRdr.FieldCount];

Первый, если вы хотите заменить содержимое values, второй, если вы хотите объявить независимую переменную ..

2 голосов
/ 13 апреля 2011

Вы не пытаетесь преобразовать int в double в этой строке; Результатом ToString () является строка, а не int. Если объект в значениях [1] является целым, то вместо этого сделайте следующее:

totalUnits = (double)(int)values[1];

Конечно, это работает лучше, если totalUnits фактически объявлено как double, а не как int.

Относительно другой ошибки

Локальная переменная с именем 'values' не может быть объявлена ​​в этой области, поскольку она будет придавать другое значение значениям, которые уже используются в родительской или текущей области для обозначения некоторых других.

Это хитрая ошибка, которая доставляет много проблем людям. Проблема real заключается в том, что локальная переменная с именем 'values' не может быть объявлена ​​в этой области, поскольку она будет придавать другое значение значениям, которые уже используются в родительской области для обозначения чего-то еще. Если вы решите эту проблему, ошибка компиляции исчезнет.

Другими словами, «значения» означают переменную, которая объявлена ​​примерно на одну треть в коде. Вы пытаетесь создать еще одну переменную с именем «values» чуть более чем на полпути кода. Если бы это второе объявление было разрешено, то одно и то же имя («значения») означало бы две разные вещи внутри этого метода.

2 голосов
/ 13 апреля 2011
  1. totalRefurb должно быть объявлено двойное:
    double totalRefurb = 0;
  2. values проблема уже решена.
2 голосов
/ 13 апреля 2011

Ваша проблема не имеет ничего общего с кастингом.Это потому, что вы использовали две разные переменные с именем values:

object[] values = new object[myDb.dbRdr.FieldCount];
// ... snipped ...

// This is where the values error comes in
object[] values = new object[myDb.dbRdr.FieldCount];
0 голосов
/ 13 апреля 2011

Второй объект [] values ​​=

Должен быть

values ​​=
ИЛИ object [] values2 =

Преобразование типа int в double:

int i = 123;double dub;

dub = (double) i;

Какой тип данных поступает из базы данных?

Преобразовать тип данных DB в .Net и затем выполнитьприведение (если возможно).

Например, столбец nvarchar в SQL Server - это строка, int - это Int32, а bigint - Int64.

int i = (int) myDb.dbRdr[ "IntColumnName"];// Может потребоваться выполнить проверку на ноль, если разрешены нулевые значения.

double d = (double) i;

0 голосов
/ 13 апреля 2011

Проблема в том, что вы объявляете значения переменных во второй раз. Это невозможно, так как в той же области у вас уже есть та же самая переменная. Поэтому во втором случае просто используйте:

values = new object[myDb.dbRdr.FieldCount];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...