2017-07-04 2 views
-1

über mein Programm:Mein boolean Wert ist falsch, obwohl alle der Code korrekt ist

Mein Algorithmus (diese Klasse) ist gemeint, ob eine Lieferung prüfen beendet worden ist und macht danach die LKW/Anhänger/Treiber für eine weitere Lieferung, zur gleichen Zeit sendet dieser Algorithmus einen anderen LKW/Anhänger/Fahrer auf eine Lieferung. Um es diese Klasse bis macht folgende:

  • prüfen, ob eine Buchung in Allocation-Modus (Allocation-Modus bedeutet im Grunde, dass die „Buchung“ ist im Gang der
  • prüft geliefert wird, ob dort Tonnage links die Buchung (Bsp. Ich möchte 500 Tonnen an einen Ort senden, aber eine Lieferung kann nur 30 Tonnen auf einmal sein, so dass es überprüft, ob es noch Tonne gibt, die geliefert werden muss)
  • Um den Fahrer (s) zu machen/Truck (s)/Trailer (s) verfügbar, die ihre Lieferung beendet haben
  • Tonnage automatisch einem Fahrer/Anhänger/LKW zuweisen
  • Einträge löschen, die beendet sind (alle abgeschlossenen Buchungen - Protokolle bleiben in der Datenbank).

Mein Problem:

Ich habe keine Ahnung, was mit meiner Klasse falsch, ich habe Stunden bei ihm gewesen und kann nicht scheinen, um herauszufinden, was mein boolean Variable verursacht (forLoopBreak) ein auslösen "Falscher" Wert beim Aufruf der Methode checkAvailTrailers(). Das Problem scheint dort zu sein, aber ich kann nicht herausfinden, was das Problem verursacht.

Klasse:

[https://pastebin.com/4up8eppd][1] 

(ich konnte es nicht hier einfügen als ich die Grenze von Zeichen met)

Hinweise:

  • ich meine Programmierung Aussehen weiß aber, aber ich bin noch neu dazu.
  • Ich beschloss, die ganze Klasse anzuhängen, da das Problem an einem anderen Ort sein könnte.

Edit:

Mein Code ist zu groß, so ist hier zu untersuchen, ist die relevanten Teile:

private void startAlgo() 
{ 

        checkAvailTrailers(); 
         if (forloopBreak == false) 
         { 
          setErrorMessage("Avail Trailers not enough!"); 
         } 
} 

private void checkAvailTrailers()
{

string trailerRouteAllocation = null; 
    string trailerVragAllocation = null; 
    string tempHolderTrailer = null; 
    string myNewTempT = null; 
    string trailermyTemp = null; 

    int trailerCount = 0; 
    int tempTra = -1; 

    //Gets trailer route classification 
    using (SqlCommand selectTrailer = new SqlCommand("SELECT [TR_Routes] FROM dbo.TrailerDetail WHERE [TR_Allocation] = " + 0, con)) 
    { 
     using (SqlDataReader reader = selectTrailer.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       trailerRouteAllocation = reader.GetString(0); 
       tempHolderTrailer = trailerRouteAllocation; 
       myNewTempT = trailerRouteAllocation; 

       for (int l = 0; l < tempHolderTrailer.Length; l++) 
       { 
        tempTra = myNewTempT.IndexOf(","); 
        if (tempTra >= 0) 
        { 
         trailermyTemp = myNewTempT.Substring(0,tempTra); 
        } 
        else 
        { 
         trailermyTemp = myNewTempT; 
         if (trailermyTemp == myCurrentBookingRoute.ToString()) 
         { 
          mycurrentTrailerAvailableRoute[trailerCount] = tempHolderTrailer; 
         } 
         break; 

        } 
        myNewTempT = myNewTempT.Substring(tempTra + 1); 
        if (trailermyTemp == myCurrentBookingRoute.ToString()) 
        { 
         mycurrentTrailerAvailableRoute[trailerCount] = trailerRouteAllocation; 
        } 
       } 
       trailerCount++; 
      } 
      reader.Close(); 
     } 
    } 
    //gets trailer vrag classification. 
    int countTrailerVrag = 0; 
    for (int l = 0; l < mycurrentTrailerAvailableRoute.Length; l++) 
    { 
     if (mycurrentTrailerAvailableRoute[l] != null) 
     { 
      using (SqlCommand select = new SqlCommand("Select [TR_Classification] FROM dbo.TrailerDetail WHERE [TR_Routes] = '" + mycurrentTrailerAvailableRoute[l] + "' AND [TR_Allocation] = " + 0, con)) 
      { 
       using (SqlDataReader readerS = select.ExecuteReader()) 
       { 
         while (readerS.Read()) 
         { 
          trailerVragAllocation = readerS.GetString(0); 
          myAvailableTrailerVragClassification[countTrailerVrag] = trailerVragAllocation; 
          countTrailerVrag++; 
         } 
         readerS.Close(); 
       } 
      } 
     } 
    } 

    int countTrailers = 0; 
    string trailerRegNum = null; 
    for (int l = 0; l < mycurrentTrailerAvailableRoute.Length; l++) 
    { 
     if (mycurrentTrailerAvailableRoute[l] != null) 
     { 
      using (SqlCommand selectT = new SqlCommand("Select [TR_RegNumber] FROM dbo.TrailerDetail WHERE [TR_Routes] = '" + mycurrentTrailerAvailableRoute[l] + "'" + " AND [TR_Classification] = '" + myAvailableTrailerVragClassification[l] + "' AND [TR_Allocation] = " + 0, con)) 
      { 
       SqlDataReader readerT = selectT.ExecuteReader(); 
        if (readerT.HasRows) 
        { 
         while (readerT.Read()) 
         { 
          trailerRegNum = readerT.GetString(0); 
          myAvailableCurrentTraillerRegNumber[countTrailers] = trailerRegNum; 
          countTrailers++; 
         } 
        } 
        else 
        { 
         forloopBreak = false; 
        } 
       readerT.Close(); 
      } 
     } 
    }//END OF TRAILER CHECKING 

    //gets trailer's max tonnage 
    int myTrailerTonMax = 0; 
    int myTrailerTon = 0; 

    for (int l = 0; l < mycurrentTrailerAvailableRoute.Length; l++) 
    { 
     if (mycurrentTrailerAvailableRoute[l] != null) 
     { 
      using (SqlCommand selectT = new SqlCommand("Select [TR_MaxTonnage] FROM dbo.TrailerDetail WHERE [TR_Routes] = '" + mycurrentTrailerAvailableRoute[l] + "'" + " AND [TR_Classification] = '" + myAvailableTrailerVragClassification[l] + "'", con)) 
      { 
       using (SqlDataReader readerS = selectT.ExecuteReader()) 
       { 
        while (readerS.Read()) 
        { 
         myTrailerTon = readerS.GetInt32(0); 
         myTrailerAvailableTonMax[myTrailerTonMax] = myTrailerTon; 
         myTrailerTonMax++; 
        } 
        readerS.Close(); 
       } 
      } 
     } 
    } 
} 

Extra: - Die Daten in meiner Datenbank stimmen mit den Kriterien while loop überein führt sogar aus, aber am Ende gibt mein boolescher Wert ein falsches Ergebnis zurück.

+0

Ihr Code ist zu groß für uns zu untersuchen, können Sie nicht einfach die relevanten Bits posten? –

+0

Ich werde versuchen, dies zu tun –

Antwort

0

Die Klausel readerT.HasRows gilt immer, wenn sich anfänglich Daten im Lesegerät befinden. Hier ist die Beschreibung der Eigenschaft aus dem MSDN page

Ruft einen Wert ab, der angibt, ob der SqlDataReader eine oder mehrere Zeilen enthält.

Was Sie stattdessen tun wollen (ich nehme an) wird forloopBreak = false; gesetzt, wenn die while Schleife beendet ist. Also setzen Sie innerhalb des using block das:

SqlDataReader readerT = selectT.ExecuteReader(); 
while (readerT.Read()) 
{ 
    trailerRegNum = readerT.GetString(0); 
    myAvailableCurrentTraillerRegNumber[countTrailers] = trailerRegNum; 
    countTrailers++; 
} 
forloopBreak = false; 
readerT.Close(); 

Lassen Sie mich wissen, ob dies funktioniert!

+0

Sie haben Recht! Dies war das Problem, es scheint, danke! –

Verwandte Themen