2013-05-28 25 views
16

Otrzymuję błąd "Nie można niejawnie przekonwertować typu" int? " do "int". Istnieje wyraźna konwersja (czy brakuje Ci obsady?) "na moim OrdersPerHour na linii powrotnej. Nie jestem pewien, dlaczego, ponieważ moje umiejętności C# nie są tak zaawansowane. Każda pomoc będzie doceniona.Nie można niejawnie przekonwertować typu "int?" do "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; 
} 

Odpowiedz

11

Dobrze jesteś odlewania OrdersPerHour do int?

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

Jednak podpis metoda jest int:

static int OrdersPerHour(string User) 

także szybkie sugestia ->parametrami eksploatacyjnymi w zapytanie, somethi ng jak:

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

Teraz rozumiem mój błąd w tej części. Ale po wprowadzeniu tych zmian otrzymuję komunikat "Użytkownik nieprzypisanej zmiennej lokalnej" OrdersPerHour "na linii zwrotnej: – MaylorTaylor

+1

@MaylorTaylor Zmień' int? OrdersPerHour; 'na' int OrdersPerHour = 0; ', powinien się tym zająć –

+0

OK to naprawiło mnie, ale teraz mam inny problem. http://stackoverflow.com/questions/16744510/executescalar-always-returns-0 – MaylorTaylor

0

metodę typ zwracany jest int i starasz się zwrócić int?.

1

Można zmienić ostatni wiersz poniższego (zakładając, że chcesz powrócić 0, gdy nie ma nic w dB):

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

Pierwszym problemem napotykanym z kodem jest wiadomość

Zmienna lokalna OrderPerHour może nie zostać zainicjalizowana przed uzyskaniem dostępu.

Dzieje się tak, ponieważ w przypadku, gdy zapytanie bazy danych spowodowałoby wyjątek, wartość może nie być ustawiona na coś (masz pustą klauzulę catch).

Aby rozwiązać ten problem, należy ustawić wartość do czego chcesz mieć, jeśli kwerenda nie powiedzie się, co jest prawdopodobnie 0:

int? OrdersPerHour = 0;

Gdy ten został rozwiązany, teraz nie ma błędu jesteś publikuje o. Dzieje się tak, ponieważ twój podpis metody deklaruje, że zwracasz wartość int, ale faktycznie zwracasz zmienną nullable int, int?.

Więc aby uzyskać int część swojego int?, można użyć właściwości .Value:

return OrdersPerHour.Value; 

Jednakże, jeśli zadeklarowana swoją OrdersPerHour być null na początku zamiast 0, wartość może być null tak wymagana poprawna weryfikacja przed powrotem jest prawdopodobnie potrzebna (na przykład rzuć bardziej konkretny wyjątek).

Aby to zrobić, można użyć właściwości HasValue aby mieć pewność, że masz wartość przed wpuszczeniem go:

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

Na marginesie, skoro jesteś kodowania w C# to byłoby lepiej, gdybyś przestrzegał konwencji C#.Twój parametr i zmienne powinny znajdować się w camelCase, a nie w PascalCase. Tak więc User i OrdersPerHour byłyby user i ordersPerHour.

11

to dlatego, że typem zwracanej metody jest int, a OrdersPerHour jest int? (Pustych), można rozwiązać ten problem poprzez zwrot jego wartości jak poniżej:

return OrdersPerHour.Value 

również sprawdzić, czy jej nie jest pusta w celu uniknięcia wyjątek jak poniżej:

if(OrdersPerHour != null) 
{ 

    return OrdersPerHour.Value; 

} 
else 
{ 

    return 0; // depends on your choice 

} 

ale w tym przypadku trzeba będzie zwraca inną wartość w części else lub po części if, w przeciwnym razie kompilator zgłosi błąd, który nie spowoduje, że wszystkie ścieżki kodu zwracają wartość.

1

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

Oświadczenie to powinno być napisane jak OrdersPerHour = (int)dbcommand.ExecuteScalar();

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

prosty

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

Chociaż może to teoretycznie działać, nie wyjaśnia, jak to działa Mówienie "proste" nie jest wystarczające –

+2

.. ** To na pewno ** nie zadziała. Masz 'NullReferenceException' gdy' i == null' i zwraca '0', gdy nie jest . –

0

Jeżeli obawiasz z możliwym null wartości zwracanej, można również uruchomić coś tak:

W ten sposób poradzisz sobie z potencjalnymi nieoczekiwanymi rezultatami i możesz również podać domyślną wartość wyrażenia, wprowadzając .GetValueOrDefault(-1) lub coś bardziej znaczącego dla Ciebie.

Powiązane problemy