Невозможно неявно преобразовать тип 'int?' to 'int'. - программирование
Подтвердить что ты не робот

Невозможно неявно преобразовать тип 'int?' to 'int'.

Я получаю сообщение об ошибке "Невозможно неявно преобразовать тип" int "? to 'int'. Явное преобразование существует (вы пропускаете листинг?)" на моем OrdersPerHour на обратной линии. Я не уверен, почему, потому что мои навыки С# не продвинуты. Любая помощь будет оценена.

static int OrdersPerHour(string User)
{
    int? OrdersPerHour;
    OleDbConnection conn = new OleDbConnection(strAccessConn);
    DateTime curTime = DateTime.Now;        

    try
    {
        string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > #" + curTime.AddHours(-1) + "# AND User = '" + User + "' AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered');";
        OleDbCommand dbcommand = new OleDbCommand(query, conn);
        dbcommand.Connection.Open();
        dbcommand.CommandType = CommandType.Text;
        OrdersPerHour = (int?)dbcommand.ExecuteScalar();

        Console.WriteLine("Orders per hour for " + User + " is " + OrdersPerHour);            
    }
    catch (OleDbException ex)
    {

    }
    finally
    {
        conn.Close();
    }
    return OrdersPerHour;
}
4b9b3361

Ответ 1

Ну, вы делаете OrdersPerHour на int?

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Однако ваша подпись метода int:

static int OrdersPerHour(string User)

Также быстрое предложение → Использовать параметры в вашем запросе, например:

string query = "SELECT COUNT(ControlNumber) FROM Log WHERE DateChanged > ? AND User = ? AND Log.EndStatus in ('Needs Review', 'Check Search', 'Vision Delivery', 'CA Review', '1TSI To Be Delivered')";
OleDbCommand dbcommand = new OleDbCommand(query, conn);
dbcommand.Parameters.Add(curTime.AddHours(-1));
dbcommand.Parameters.Add(User);

Ответ 2

это потому, что возвращаемый тип вашего метода - int, а OrdersPerHour - int? (nullable), вы можете решить это, возвращая его значение, как показано ниже:

return OrdersPerHour.Value

также проверьте, не имеет ли значение null, чтобы избежать исключения, как показано ниже:

if(OrdersPerHour != null)
{

    return OrdersPerHour.Value;

}
else
{

  return 0; // depends on your choice

}

но в этом случае вам придется возвращать какое-то другое значение в части else или после if if, иначе компилятор будет отмечать ошибку, если не все пути возврата кода.

Ответ 3

Int32 OrdersPerHour = 0;
OrdersPerHour = Convert.ToInt32(dbcommand.ExecuteScalar());

Ответ 4

Вы можете изменить последнюю строку следующим образом (при условии, что вы хотите вернуть 0, когда в db ничего нет):

return OrdersPerHour == null ? 0 : OrdersPerHour.Value;

Ответ 5

Тип возвращаемого метода int, и вы пытаетесь вернуть int?.

Ответ 6

Первой проблемой, возникшей с вашим кодом, является сообщение

Локальная переменная OrdersPerHour не может быть инициализирована перед доступом.

Это происходит потому, что в случае, когда запрос к базе данных генерирует исключение, значение может быть не установлено ни на что (у вас есть предложение о пустое catch).

Чтобы исправить это, установите значение для того, что вы хотели бы иметь, если запрос завершился неудачно, что, вероятно, 0:

int? OrdersPerHour = 0;

Как только это исправлено, теперь вы можете сообщить об ошибке. Это происходит из-за того, что ваша сигнатура метода заявляет, что вы возвращаете int, но на самом деле вы возвращаете переменную с переменным значением null, int?.

Итак, чтобы получить int часть вашего int?, вы можете использовать свойство .Value:

return OrdersPerHour.Value;

Однако, если вы объявили, что OrdersPerHour будет null при запуске вместо 0, значение может быть нулевым, поэтому, вероятно, потребуется правильная проверка перед возвратом (например, выберите более конкретное исключение).

Чтобы сделать это, вы можете использовать свойство HasValue, чтобы убедиться, что у вас есть значение перед его возвратом:

if (OrdersPerHour.HasValue){
    return OrdersPerHour.Value;
}
else{
    // Handle the case here
}

В качестве побочного примечания, поскольку вы кодируете на С#, было бы лучше, если бы вы следовали правилам С#. Ваш параметр и переменные должны быть в camelCase, а не в PascalCase. Итак, User и OrdersPerHour будут User и OrdersPerHour.

Ответ 7

OrdersPerHour = (int?)dbcommand.ExecuteScalar();

Это утверждение должно быть напечатано как, OrdersPerHour = (int)dbcommand.ExecuteScalar();

Ответ 8

простой

(i == null) ? i.Value : 0;

Ответ 9

Если вы заинтересованы в возможном возвращаемом значении null, вы также можете запустить что-то вроде этого:

int ordersPerHour;  // can't be int? as it different from method signature
// ... do stuff ... //
ordersPerHour = (dbcommand.ExecuteScalar() as int?).GetValueOrDefault();

Таким образом, вы будете иметь дело с потенциальными неожиданными результатами и также можете предоставить значение по умолчанию для выражения, введя .GetValueOrDefault(-1) или что-то более значимое для вас.