2013-05-28 1 views
16

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

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; 
} 

ответ

11

Ну вы литья OrdersPerHour к int?

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

Тем не менее, ваш метод подписи int:

static int OrdersPerHour(string User) 

Также быстрое предложение ->Используйте параметры ваш запрос, someti нг как:

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); 
+0

Теперь я понимаю свою ошибку в этой части. Но после внесения этих изменений я получаю «Пользователь с непризнанной локальной переменной« OrdersPerHour »в обратной линии. – MaylorTaylor

+1

@MaylorTaylor Изменить' int? OrdersPerHour; 'на' int OrdersPerHour = 0; ', должен позаботиться об этом. –

+0

OK что исправил меня, но теперь у меня другая проблема. http://stackoverflow.com/questions/16744510/executescalar-always-returns-0 – MaylorTaylor

0

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

1

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

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

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

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

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

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

int? OrdersPerHour = 0;

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

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

return OrdersPerHour.Value; 

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

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

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

В качестве примечания, так как вы кодирования в C# это было бы лучше, если бы вы следовали правилам C#.Ваш параметр и переменные должны быть в camelCase, а не в PascalCase. Таким образом, User и OrdersPerHour будут user и ordersPerHour.

11

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

return OrdersPerHour.Value 

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

if(OrdersPerHour != null) 
{ 

    return OrdersPerHour.Value; 

} 
else 
{ 

    return 0; // depends on your choice 

} 

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

1

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

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

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

простой

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

Хотя это теоретически может работать, оно не объясняет, как это работает никому. Говорить «просто» на самом деле недостаточно. –

+2

.. ** ** ** ** не будет работать. У вас есть 'NullReferenceException', когда' i == null' и возвращает '0', когда он не является , –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^