Невозможно неявно преобразовать тип '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;
}
Ответы
Ответ 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)
или что-то более значимое для вас.